-
[백준 10828] 스택C 프로그래밍/BOJ 2022. 8. 15. 11:46728x90
https://www.acmicpc.net/problem/10828
#include <stdio.h> #include <string.h> int N; struct _st { char order[10]; }O[10000]; int push[10000]; int stack[10000]; int sptr; void input(void) { scanf("%d", &N); sptr = N; for (int i = 0; i < N; i++) { scanf("%s", O[i].order); if (strcmp(O[i].order,"push") == 0) scanf("%d", &push[i]); } } void stack_push(int i) { if (sptr == 0) return; sptr--; stack[sptr] = push[i]; } void stack_pop(void) { if (sptr == N) { printf("%d\n", -1); return; } printf("%d\n", stack[sptr]); stack[sptr] = 0; //size 측정 때문 sptr++; return; } void stack_size(void) { int cnt = 0; for (int i = N - 1; i >= 0; i--) { if (stack[i] == 0) break; cnt++; } printf("%d\n", cnt); return; } void stack_empty(void) { if (sptr == N) { printf("%d\n", 1); return; } printf("%d\n", 0); return; } void stack_top(void) { if (sptr == N) { printf("%d\n", -1); return; } printf("%d\n", stack[sptr]); } void stack_func(void) { for (int i = 0; i < N; i++) { if (strcmp(O[i].order, "push") == 0) stack_push(i); else if (strcmp(O[i].order, "pop") == 0) stack_pop(); else if (strcmp(O[i].order, "size") == 0) stack_size(); else if (strcmp(O[i].order, "empty") == 0) stack_empty(); else if (strcmp(O[i].order, "top") == 0) stack_top(); } } int main(void) { input(); stack_func(); return 0; }
FD 스택(full일 때 sptr == 0, empty일 때 sptr == N)으로 구현해 주었다.
1. push 동작에서 만약 sptr == 0이면 (스택이 꽉 찼다면) 더 이상 원소를 넣을 수 없으므로 그냥 리턴해준다.
그렇지 않으면 sptr를 한 칸 내리고, 바로 해당 자리에 원소를 삽입한다.
2. pop 동작에서 만약 sptr == N이면 (스택이 비어있다면) 꺼낼 원소가 없으므로 -1을 출력하고 리턴해준다.
그렇지 않으면 sptr가 가리키는 자리의 원소를 인쇄하고, 해당 자리에 0을 대입해준다. 이론상 0을 대입해주는 동작은 필요하지 않지만, 나중에 size를 계산하기 위해 일부러 추가해주었다. 그리고 sptr를 한 칸 올려준다.
3. size 측정 함수에서는 for 루프를 돌면서 i == N -1 (첫 원소)부터 stack[i] == 0이 될 때 까지 돌면서 cnt를 세어 준다.
4. empty 함수에서는 만약 sptr == N이면 스택이 비어있는 것이므로 1을 출력하고, 그렇지 않으면 0을 출력한다.
5. top 함수에서는 만약 sptr == N이면 스택이 비어있는 것이므로 -1을 출력하고, 그렇지 않으면 현재 sptr가 가리키고 있는 값이 스택에서 가장 위에 있는 값이므로 그것을 출력한다.
스택을 공부하기 좋은 문제였다.
더불어 문자열 비교는 strcmp 라이브러리(결과가 0일때 두 문자열이 같음) 사용했다.
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 2567] 색종이-2 (0) 2022.08.18 [백준 2564] 경비원 (0) 2022.08.17 [백준 13458] 시험감독 (0) 2022.08.13 [백준 2869] 달팽이는 올라가고 싶다 (0) 2022.08.01 [백준 1978] 소수 찾기 (0) 2022.07.31