-
백준 10828(스택) c언어백준 문제 2021. 9. 15. 01:42728x90
스택을 구현하는 문제 입니다.
보통 스택은 c++ STL 로 편하게 사용가능합니다. 하지만 이번에는 C언어를 사용하여 처음 부터 끝까지
스택을 구현하는 코딩을 해봤습니다.
스택의 원리를 이해하는데 큰 도움이 되었습니다.
코드를 보겠습니다.
int stack[10001]; int cnt = 0; int main() { int n; scanf("%d", &n); while (n--) { char ch[10]; scanf("%s", ch); if (strcmp(ch, "push") == 0) { int a; scanf("%d", &a); push(a); } else if (strcmp(ch, "empty") == 0) { printf("%d\n", empty()); } else if (strcmp(ch, "pop") == 0) { if (empty()) printf("-1\n"); else pop(); } else if (strcmp(ch, "top") == 0) { if (empty()) printf("-1\n"); else top(); } else if (strcmp(ch, "size") == 0) { printf("%d\n", cnt); } } return 0; }
먼저 전역변수 stack이라는 배열을 선언하고 cnt변수를 선언했습니다.
함수를 이용해 스택을 구현하기 때문에 전역변수로 설정했습니다.
cnt변수는 stack 배열의 인덱스 역할을 합니다. stack배열에 원소가 들어오면 cnt변수는 1이 늘어나
다음 배열 칸을 가리키게 됩니다.
while문을 이용하여 명령의 개수(n)이 0이 될때까지 반복해 줍니다.
명령은 문자열로 받게 됩니다. 문자열은 ch에 저장됩니다.
문자열 ch와 입력 명령을 비교하기 위해 strcmp 함수를 사용해주었습니다.
strcmp함수는 문자열과 입력받는 문자열이 같은지 다른지 비교해주는 함수입니다.
문자열과 입력받는 문자열이 같으면 0을 반환하고 한 문자라도 틀리면 1을 반환합니다.
push 함수
push함수는 정수가 들어오므로 정수를 따로 입력받아주어야 합니다. 따라서 a라는 변수를 선언하고 입력받아줍니다.
push 함수 코드는 이와 같습니다.
void push(int a) { stack[cnt++] = a; }
cnt는 현재 0이므로 push함수 parameter로 a를 넣어주면 stack[cnt] 은 stack[0] 과 같으므로 그 자리에 a를 넣어줍니다.
그리고 stack배열의 인덱스 0이 채워졌으므로 cnt값은 1이 늘어나게 됩니다.
empty 함수
int empty() { if (cnt == 0) return 1; else return 0; }
empty 함수는 반환 값을 int 형태로 만들었습니다. 따라서 stack배열이 비워져있으면 1을 반환하고
원소가 하나라도 있으면 0을 반환합니다.
cnt값은 항상 원소가 들어가야할 인덱스를 가리키므로 cnt가 0이면 0인덱스가 비워있다는 의미이기때문에
stack배열은 비워져있다는 의미입니다. 따라서 1을 반환해줍니다.
그게 아니면 0을 반환해줍니다.
pop 함수
먼저 pop함수 이전에 만약 empty가 1이면 stack배열에 아무것도 없다는 뜻이므로 -1을 출력해줍니다.
그게 아니면 pop함수를 사용합니다.
void pop() { cnt--; printf("%d\n", stack[cnt]); stack[cnt] = 0; }
cnt는 stack배열에 들어가야할 인덱스 위치를 의미하므로 먼저 stack의 가장 위에있는 원소를 출력하려면
cnt값에 -1을 해주면 stack배열에 가장 위에 있는 원소를 가리키게 됩니다.
바로 출력해주고
그 값을 0으로 만들면 비워지게 됩니다.
top 함수
먼저 pop함수 이전에 만약 empty가 1이면 stack배열에 아무것도 없다는 뜻이므로 -1을 출력해줍니다.
그게 아니면 top함수를 사용합니다.
void top() { printf("%d\n", stack[cnt - 1]); }
pop함수와 달리 단순히 stack배열에 가장 위에있는 원소를 출력해주면 되기때문에 코드는 간단합니다.
size 함수
size함수는 결국 cnt의 값이기 때문에 따로 함수로 만들지 않고 cnt 값만 출력하게끔 하였습니다.
전체 코드입니다.
#include<stdio.h> #include<string.h> void push(int a); int empty(); void pop(); void top(); int stack[10001]; int cnt = 0; int main() { int n; scanf("%d", &n); while (n--) { char ch[10]; scanf("%s", ch); if (strcmp(ch, "push") == 0) { int a; scanf("%d", &a); push(a); } else if (strcmp(ch, "empty") == 0) { printf("%d\n", empty()); } else if (strcmp(ch, "pop") == 0) { if (empty()) printf("-1\n"); else pop(); } else if (strcmp(ch, "top") == 0) { if (empty()) printf("-1\n"); else top(); } else if (strcmp(ch, "size") == 0) { printf("%d\n", cnt); } } return 0; } void push(int a) { stack[cnt++] = a; } int empty() { if (cnt == 0) return 1; else return 0; } void pop() { cnt--; printf("%d\n", stack[cnt]); stack[cnt] = 0; } void top() { printf("%d\n", stack[cnt - 1]); }
'백준 문제' 카테고리의 다른 글
백준 10866(덱) c언어 (0) 2021.09.16 백준 10845(큐) c언어 (0) 2021.09.15 백준 17608(막대기) c++ (0) 2021.09.14 백준 2437(저울) c++ (0) 2021.09.11 백준 1448(삼각형 만들기) c++ (0) 2021.09.11