본문 바로가기
전산 관련 시험/프로그래밍(C, JAVA, Python)

[C] 프로그래밍 언어 (ex. 23) Stack 이해

by 응_비 2024. 10. 17.
#include <stdio.h>
#define MAX_SIZE 5

int stack[MAX_SIZE];  // 스택 배열
int p = -1;  // 스택 포인터

int isEmpty() {
    if (p == -1) return 1;
    return 0;
}

int isFull() {
    if (p == MAX_SIZE - 1) return 1;
    return 0;
}

void push(int num) {
    if (isFull()) {
        printf("Full");
        return;
    }
    stack[++p] = num;
}

int pop() {
    if (isEmpty()) {
        printf("Empty");
        return -1;  // -1을 반환하여 에러 처리
    }
    return stack[p--];
}

int main(int argc, char const* argv[]) {
    push(1); push(2);
    while (!isEmpty()) {
        printf("%d", pop());
    }
    push(3); push(4); push(5);
    printf("%d", pop());
    push(6); printf("%d", pop()); printf("%d", pop());
    push(6); printf("%d", pop()); printf("%d", pop());
    return 0;
}


코드 설명:

1. 스택 배열 선언: stack[MAX_SIZE]는 크기가 5인 정수형 배열이며, 스택의 역할을 합니다.
2. 스택 포인터 p: 현재 스택의 위치를 가리킵니다. 처음엔 -1로 초기화되며, 스택이 쌓일 때마다 증가하고, 스택에서 제거할 때 감소합니다.
3. 함수 isEmpty와 isFull: 스택이 비었는지(isEmpty), 가득 찼는지(isFull)를 검사하는 함수입니다.
4. push 함수: 스택이 가득 차지 않았다면 값을 스택에 추가하는 함수입니다.
5. pop 함수: 스택에서 가장 마지막에 삽입된 값을 제거하고 반환합니다.

코드 동작 그림 설명:

1. 초기 상태: 스택이 비어 있는 상태이며, 스택 포인터 p = -1입니다.
2. push(1) & push(2):
• 스택에 1, 2가 순서대로 들어갑니다.
• 스택 상태: [1, 2], 포인터 p = 1
3. pop() 두 번 반복:
• pop()을 두 번 실행하여, 스택에서 2와 1을 차례대로 꺼내 출력합니다.
• 스택 상태: [] (비어있음), 포인터 p = -1
4. push(3) & push(4) & push(5):
• 스택에 3, 4, 5를 순서대로 넣습니다.
• 스택 상태: [3, 4, 5], 포인터 p = 2
5. pop():
• pop()을 한 번 실행하여 5를 꺼내 출력합니다.
• 스택 상태: [3, 4], 포인터 p = 1
6. push(6) & 두 번의 pop():
• 스택에 6을 넣고, 두 번 pop()하여 6과 4를 차례로 꺼냅니다.
• 스택 상태: [3], 포인터 p = 0
7. 다시 push(6) & 두 번의 pop():
• 다시 6을 넣고, 두 번 pop()하여 6과 3을 차례로 꺼냅니다.
• 스택 상태: [] (비어있음), 포인터 p = -1

이렇게 해서 전체 코드를 통해 스택의 기본 동작을 확인할 수 있습니다. 스택의 후입선출(LIFO) 구조에 따라 가장 마지막에 삽입된 값이 먼저 꺼내지는 것을 보여줍니다.

그림을 통해 구체적으로 설명을 보충하고 싶다면 다음과 같이 스택의 변화를 시각화할 수 있습니다:

1. 초기 상태 (스택 비어 있음):

[  ]  -> 스택 포인터 p = -1


2. push(1), push(2) 실행 후:

[1, 2] -> 스택 포인터 p = 1


3. pop() 두 번 실행 후:

[  ]  -> 스택 포인터 p = -1 (스택 비어 있음)


4. push(3), push(4), push(5) 실행 후:

[3, 4, 5] -> 스택 포인터 p = 2


5. pop() 실행 후 (5 제거):

[3, 4] -> 스택 포인터 p = 1


6. push(6) 및 두 번의 pop() 실행 후:

[3] -> 스택 포인터 p = 0 (6과 4 제거)


7. push(6) 및 두 번의 pop() 실행 후:

[  ]  -> 스택 포인터 p = -1 (6과 3 제거)

해당 코드의 실행 결과를 분석하면 출력되는 값은 다음과 같습니다:


코드의 출력:

1. push(1)과 push(2) 후, 스택은 [1, 2] 상태입니다.
• while (!isEmpty())로 스택이 비어질 때까지 pop()을 실행하면, 2와 1이 차례로 출력됩니다.
• 출력: 21
2. push(3), push(4), push(5) 후, 스택은 [3, 4, 5] 상태입니다.
• pop()으로 5를 출력합니다.
• 출력: 5
3. push(6) 후, 스택은 [3, 4, 6] 상태입니다.
• pop() 두 번으로 6과 4가 차례로 출력됩니다.
• 출력: 64
4. 다시 push(6) 후, 스택은 [3, 6] 상태입니다.
• pop() 두 번으로 6과 3이 차례로 출력됩니다.
• 출력: 63


최종 출력 결과:

21
5
64
63

따라서, 코드의 최종 출력은 2156463
입니다.

댓글