전산 관련 시험/프로그래밍(C, JAVA, Python)

[C] 프로그래밍 언어 (23.02 09) - 스택 이해

응_비 2024. 10. 6. 12:43
#include <stdio.h>
#define MAX_SIZE 10

int isWhat[MAX_SIZE];
int point = -1;

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

int isFull() {
    if (point == 10) return 1;
    return 0;
}

void into(int num) {
    if (isFull() == 1) printf("Full");
    else isWhat[++point] = num;
}

int take() {
    if (isEmpty() == 1) printf("Empty");
    else return isWhat[point--];
    return 0;
}

main() {
    into(5); into(2);
    while (!isEmpty()) {
        printf("%d", take());
    }
    into(4); into(1); printf("%d", take());
    into(3); printf("%d", take()); printf("%d", take());
    into(6); printf("%d", take()); printf("%d", take());
}

 
해설:

  1. into 함수는 isFull()을 검사하여 스택이 꽉 차지 않았을 때만 요소를 추가합니다.
  2. take 함수는 isEmpty()를 검사하여 스택이 비어 있지 않을 때만 요소를 제거하고 출력합니다.
  3. 프로그램은 다음 순서로 실행됩니다:
    • into(5), into(2) 실행 후 take()로 2, 5가 출력.
    • into(4), into(1) 후 take()로 1이 출력.
    • into(3) 후 take()로 3, 4가 출력.
    • into(6) 후 take()로 6이 출력.

출력 결과: 251346
 
 
 
이 프로그램은 스택(Stack)의 동작을 구현하고, 데이터를 삽입(into())하고 제거(take())하면서 특정 조건을 확인하는 프로그램입니다. 프로그램은 스택의 기본적인 동작인 삽입(Push)과 제거(Pop)를 수행하며, 스택이 비어 있거나 꽉 찼을 때의 예외 처리도 포함하고 있습니다.

프로그램 구성 요소 및 역할 설명

1. 전역 변수 및 상수 정의

#define MAX_SIZE 10  // 스택의 최대 크기를 10으로 설정합니다.

int isWhat[MAX_SIZE];  // 스택의 데이터를 저장할 배열입니다.
int point = -1;  // 스택의 최상단 위치를 가리키는 변수입니다. -1은 스택이 비어 있음을 나타냅니다.
  • MAX_SIZE는 스택의 최대 크기를 정의합니다. 즉, 이 스택은 최대 10개의 데이터를 저장할 수 있습니다.
  • isWhat 배열은 스택에 저장될 데이터를 보관하는 공간입니다.
  • point는 스택의 현재 위치를 나타냅니다. 처음에는 -1로 설정되어 있는데, 이는 스택이 비어 있다는 것을 의미합니다.

2. 함수 정의

isEmpty() 함수

c
코드 복사
int isEmpty() { if (point == -1) return 1; // point가 -1일 때, 스택이 비어 있음을 나타내므로 1을 반환합니다. return 0; // 스택이 비어 있지 않으면 0을 반환합니다. }
  • 이 함수는 스택이 비어 있는지 확인합니다.
  • point가 -1일 때, 스택이 비어 있음을 의미하며 1을 반환합니다.
  • 그 외의 경우에는 스택이 비어 있지 않다는 의미로 0을 반환합니다.

isFull() 함수

c
코드 복사
int isFull() { if (point == 10) return 1; // point가 10일 때, 스택이 가득 찼음을 의미하므로 1을 반환합니다. return 0; // 스택이 가득 차지 않았으면 0을 반환합니다. }
  • 이 함수는 스택이 가득 찼는지 확인합니다.
  • point가 10이면 스택의 최대 크기인 MAX_SIZE에 도달했으므로 1을 반환합니다.
  • 그 외의 경우에는 스택이 가득 차지 않았다는 의미로 0을 반환합니다.

into() 함수

c
코드 복사
void into(int num) { if (isFull() == 1) printf("Full"); // 스택이 가득 찼으면 "Full"을 출력하고 아무것도 하지 않습니다. else isWhat[++point] = num; // 가득 차지 않았으면 point를 1 증가시킨 후 해당 위치에 num 값을 저장합니다. }
  • 이 함수는 스택에 **데이터를 삽입(Push)**하는 역할을 합니다.
  • 먼저 isFull() 함수를 호출하여 스택이 가득 찼는지 확인합니다.
    • 스택이 가득 찼을 경우, "Full"이라는 메시지를 출력하고 함수를 종료합니다.
  • 스택이 가득 차지 않았을 경우, point를 1 증가시킨 후 isWhat 배열의 point 위치에 num 값을 저장합니다.

take() 함수

c
코드 복사
int take() { if (isEmpty() == 1) printf("Empty"); // 스택이 비어 있으면 "Empty"를 출력하고 함수를 종료합니다. else return isWhat[point--]; // 스택이 비어 있지 않으면 point 위치의 값을 반환한 후 point를 1 감소시킵니다. return 0; }
  • 이 함수는 스택에서 **데이터를 제거(Pop)**하는 역할을 합니다.
  • 먼저 isEmpty() 함수를 호출하여 스택이 비어 있는지 확인합니다.
    • 스택이 비어 있으면 "Empty" 메시지를 출력하고 함수를 종료합니다.
  • 스택이 비어 있지 않으면 point 위치의 값을 반환한 후 point를 1 감소시켜 최상단 위치를 한 칸 아래로 이동시킵니다.

main() 함수의 동작

c
코드 복사
main() { into(5); into(2); while (!isEmpty()) { printf("%d", take()); } into(4); into(1); printf("%d", take()); into(3); printf("%d", take()); printf("%d", take()); into(6); printf("%d", take()); printf("%d", take()); }

main() 함수 단계별 동작

  1. into(5); into(2);
    • 5와 2를 스택에 삽입합니다.
    • 이때 point는 -1에서 0(5가 들어감), 1(2가 들어감)으로 이동합니다.
    • 스택 상태: [5, 2]
  2. while (!isEmpty()) { printf("%d", take()); }
    • 스택이 비어 있지 않은 동안 take() 함수를 호출하여 값을 제거(Pop)하고 출력합니다.
    • 2가 먼저 출력되고, 5가 출력됩니다.
    • 이때 point는 1에서 0(2가 빠짐), 0에서 -1(5가 빠짐)으로 이동합니다.
    • 출력: 25
  3. into(4); into(1); printf("%d", take());
    • 4와 1을 스택에 삽입합니다.
    • point는 -1에서 0(4가 들어감), 0에서 1(1이 들어감)으로 이동합니다.
    • take()로 1을 제거(Pop)하고 출력합니다.
    • point는 1에서 0으로 이동합니다.
    • 출력: 25 1
  4. into(3); printf("%d", take()); printf("%d", take());
    • 3을 스택에 삽입합니다.
    • point는 0에서 1로 이동합니다.
    • take()로 3, 4를 차례로 제거(Pop)하고 출력합니다.
    • point는 1에서 0, 0에서 -1로 이동합니다.
    • 출력: 25 1 3 4
  5. into(6); printf("%d", take()); printf("%d", take());
    • 6을 스택에 삽입합니다.
    • point는 -1에서 0으로 이동합니다.
    • take()로 6을 제거(Pop)하고 출력합니다.
    • point는 0에서 -1로 이동합니다.
    • 출력: 25 1 3 4 6

최종 출력 결과

코드 복사
251346

프로그램 동작 요약

  • 프로그램은 스택 자료구조를 사용하여 데이터를 관리합니다.
  • into() 함수는 데이터를 스택에 삽입하고, take() 함수는 스택에서 데이터를 제거합니다.
  • main() 함수는 스택에 데이터를 삽입하고 제거하면서 특정 순서대로 값을 출력합니다.
  • 스택이 비어 있거나 가득 찼을 때 예외 처리를 수행하여 "Empty" 또는 "Full" 메시지를 출력합니다.

추가 설명

  • 이 프로그램은 LIFO (Last In, First Out) 원칙을 따르는 스택 자료구조의 동작을 잘 보여줍니다.
  • isEmpty()와 isFull() 함수를 사용하여 스택의 상태를 확인하고, 안전하게 데이터를 삽입하거나 제거할 수 있도록 합니다.
  • 반복문과 조건문을 통해 스택의 상태에 따라 적절한 동작을 수행하고, 이를 통해 데이터의 삽입과 제거가 어떻게 이루어지는지를 확인할 수 있습니다.