#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
입니다.
'전산 관련 시험 > 프로그래밍(C, JAVA, Python)' 카테고리의 다른 글
[C] 프로그래밍 언어 (문자열의 비교와 Case문) (2) | 2024.10.17 |
---|---|
[C] 프로그래밍 언어 (ex. 19) (1) | 2024.10.16 |
[JAVA] 프로그래밍 언어 (ex. 28) (0) | 2024.10.15 |
[JAVA] 프로그래밍 언어 (ex. 30) (1) | 2024.10.15 |
[JAVA] 프로그래밍 언어 (ex. 29) 값 전달 vs 참조 전달 (0) | 2024.10.15 |
댓글