https://www.acmicpc.net/problem/10828
스택을 구현하는 문제.
자료구조에 관한 공부는 다음에 좀더 심층적으로 하고, 우선은 스택은 LIFO (Last In, First Out)구조라는 것만 알고 넘어가자.
구현해야 하는 함수는 다음과 같다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
시키는 대로 하자.
#include <stdio.h>
#include <string.h>
typedef struct {
int stack[10000];
int len;
}Stack;
int getElement(Stack * st) { return st->stack[(st->len)-1]; }
void push(Stack * st, int x) { st->stack[st->len++] = x; }
int pop(Stack * st) {
if (st->len) {
int ret = getElement(st);
st->stack[(st->len--)-1] = 0;
return ret;
} else {
return -1;
}
}
int size(Stack * st) { return st->len; }
int empty (Stack * st) { return st->len == 0;}
int top(Stack * st) {
if (st->len) {
return getElement(st);
} else {
return -1;
}
}
int main () {
Stack st = {{0}, 0};
int t, x;
char func[6];
scanf("%d", &t);
while (t--) {
scanf("%s", func);
if (strcmp(func, "push") == 0) {
scanf("%d", &x);
push(&st, x);
} else if(strcmp(func, "pop") == 0) {
printf("%d\n", pop(&st));
} else if(strcmp(func, "size") == 0) {
printf("%d\n", size(&st));
} else if(strcmp(func, "empty") == 0) {
printf("%d\n", empty(&st));
} else if(strcmp(func, "top") == 0) {
printf("%d\n", top(&st));
}
}
}
우선 만들고 느꼈지만, 지금 구현한 문제는 어디까지나 문제풀이를 위해 그냥 구현한 스택이다. 그러므로 구현한 스택이 정적이라는 단점을 갖는다. 그러므로 정적인 배열을 사용하기보다는, linked list를 먼저 구현하여 이를 stack에 적용을 해보던가, 아니면 동적할당을 계속하거나, 또는 c++의 vector를 사용하면 좀 더 개선할 수 있을 것 같다. 뭐 일단은 C언어를 좀 더 능숙하게 다루는데 초점을 두자.
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 10845번 C언어 풀이 (0) | 2021.11.11 |
---|---|
백준 10989번 C언어 풀이 (0) | 2021.11.05 |
백준 1011번 C언어 풀이 (0) | 2021.11.01 |
백준 2609번 C언어 풀이 (0) | 2021.10.27 |
백준 2751번 C언어 풀이 (0) | 2021.10.26 |