예전에 풀었지만 지금에서야 올려봅니당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;
    *= 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;
}

cs

 

 

+ Recent posts