예전에 풀었지만 지금에서야 올려봅니당3
제일 처음으로 풀었던 문제~!
처음으로 풀어봤던 문제라 코드가 지저분한 것 같네요^^(?핑계)
무조건 입력 한번에, 출력 한번에 해야되는 줄 알고...
스택을 두 개로 했어요... 입력용 스택, 출력용 스택 ㅋㅎㅋㅎ
1. initialize 함수
스택을 초기화 해준다. 스택의 포인터(현재위치)는 0으로, 스택의 크기(s->max)는 지정해 준 값(max)을 저장한다. 스택 배열에 공간을 할당하였을 때 크기(s->max)가 0이면 -1을 리턴하여 오류가 있음을 알린다.
2. pushX 함수
스택에 push하는 함수이며, 스택이 가득차 있을때 -1을 반환하고 그렇지 않으면 x를 넣고, 스택 포인터(s->ptr, 현재위치)는 다음을 가리켜야 한다.
3. pop 함수
스택에서 가장 위에있는 것을 pop하는 함수이며, 스택이 비어있을 때 -1을 반환하고, 그렇지 않으면 스택 포인터(s->ptr, 현재위치)를 이전으로 옮기고, 스택에서 pop한 값을 리턴한다.
4. size 함수
스택의 크기를 반환하는 함수이며, s->ptr을 알면 스택에 있는 정수의 갯수를 알 수 있다. s->ptr은 곧 배열의 인덱스인데, 포인터는 스택 속에 마지막 데이터가 들어있는 곳의 다음 인덱스를 가리키기 때문에 s->ptr의 숫자가 곧 스택에 있는 정수의 갯수이다.
5. empty 함수
(s->ptr <= 0)이 부분! 0보다 작거나 같다고 해 준 이유는 혹시 모를 오류를 방지하기 위함이다(책에서 봤는데 이렇게 기억합니다ㅠㅠ). =만 써주어도 된다.
6. top 함수
스택의 top을 반환하는 함수이며, s->ptr은 가장 위(마지막) 데이터의 다음을 가리키기 때문에 s->stk[s->ptr-1]를 반환한다.
7. Print 함수
스택에 있는 것들을 차례대로 프린트하는 함수. for문을 이용하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 |
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10000
typedef struct {
int max; //스택 배열의 최대 크기
int *stk; //스택 표현할 배열
int ptr; //현재 위치
}Stack;
int initialize(Stack* s, int max) {
s->ptr = 0;
if ((s->stk = (int*)calloc(max, sizeof(int))) == NULL) {
s->max = 0;
return -1;
}
s->max = max;
return 0;
}
int pushX(Stack* s, int x) {
if (s->ptr >= s->max) //스택이 가득 차 있을 때
return -1;
s->stk[s->ptr++] = x;
return 0;
}
int pop(Stack* s, int *x) {
if (s->ptr <= 0) //스택이 비어있을 때
return -1;
*x = s->stk[--s->ptr];
return *x;
}
int size(Stack* s) { //스택에 들어있는 정수의 갯수 출력
return s->ptr;
}
int empty(Stack* s) { //스택이 비어있으면 1, 아니면 0출력
if (s->ptr <= 0) //스택이 비어있을 때
return 1;
return 0;
}
int top(Stack* s) {//스택의 맨 위에있는 정수 출력, 비어있으면 -1 출력
if (s->ptr <= 0) //스택이 비어있을 때
return -1;
else
return s->stk[s->ptr - 1];
}
void Print(Stack* s) {
for (int i = 0; i < s->ptr; i++)
printf("%d\n", s->stk[i]);
}
int main(void) {
Stack s, s2;
int ans = 0, input = 0;
char ans1[] = "empty";
ans1[0] = '\0';
initialize(&s, MAX);
initialize(&s2, MAX);
scanf("%d", &ans);
while (ans > 0) {
scanf("%s", ans1);
if (strcmp(ans1, "push") == 0) {
scanf("%d", &input);
pushX(&s, input);
}
else if (strcmp(ans1, "pop") == 0) {
pushX(&s2, pop(&s, &input));
}
else if (strcmp(ans1, "size") == 0) {
pushX(&s2, size(&s));
}
else if (strcmp(ans1, "empty") == 0) {
pushX(&s2, empty(&s));
}
else if (strcmp(ans1, "top") == 0) {
pushX(&s2, top(&s));
}
ans--;
}
Print(&s2);
return 0;
} |
'백준' 카테고리의 다른 글
백준 알고리즘 2750번 수 정렬하기 (0) | 2019.01.30 |
---|---|
백준 알고리즘 10845번 큐 (0) | 2019.01.26 |
백준 알고리즘 1011번 Fly me to the Alpha Centauri (0) | 2019.01.26 |
백준 알고리즘 9012번 괄호 (0) | 2019.01.15 |
백준 알고리즘 1991번 트리순회 (0) | 2019.01.08 |