[ 자료구조 ] 스택(Stack)

THIST·2024년 6월 20일
post-thumbnail

자료구조란 무엇인가? 개발자가 되려면 꼭 해야하나?

정답은 'Yes'이다. 자료구조는 컴퓨터 과학의 핵심 개념으로,
데이터가 어떻게 저장되고 어떻게 사용되고, 어떻게 관리되는지 알아야 컴퓨터 전체의 복잡한 시스템의 구조를 이해할 수 있다. ( 되게 복잡한데 차근차근 가보자 )

그 첫번째 단계로 우선 Stack에 대해서 설명하려고 한다.

Stack이란 선입후출 FILO(First In, Last Out)구조를 지닌, 자료구조 이다. 즉, 먼저 삽입된 데이터가 마지막에 제거되는 구조를 의미한다.

또한, Stack에는 'Top'이라는 개념이 존재하는데,
스택의 맨 위에 있는 요소를 가리킨다. 이 'Top'에서는 데이터가 추가(Push) 되거나, 삭제(Pop)되는 위치이다.

이를 통해 Stack은 다음과 같은 특징은 지닌다.


1. Push 연산:

데이터를 Stack의 맨 위에 추가하는 작업이다. ( 데이터 삽입 )

예를 들어, "Apple"이란 Data가 있을 때, Push를 하면 다음과 같다.

다음으로, "Banana"란 Data를 Push해보자.

마지막으로, "Melon"이란 Data를 Push해보자.

이렇게 Data를 넣을 때마다, Top이 위로 올라가는것을 볼 수 있다.
마치, 우리가 원형 주스잔에 공을 하나씩 넣었을 때, 가장 마지막으로 넣은게 가장 위쪽에 있는 공인것 처럼 말이다.

이제 데이터를 하나씩 지워볼까?

데이터를 지우기 위해 Pop을 해보겠다.



2. Pop 연산:

Stack의 Top에 존재하는 Data를 삭제한다. ( 데이터 삭제 )

현재 Stack의 Top에 존재하는 데이터인 "Melon"이 삭제된다.

다음으로, "Banana"를 삭제해보자.



마지막으로, "Apple"을 삭제해보자.



마지막까지 남은 데이터 "Apple"까지 삭제하니 텅텅 비어져 버렸다.

이렇듯, 데이터가 쌓이고 삭제되는 과정을 통해 Stack 자료구조의 기본 원리를 이해할 수 있다.

Stack은 단순한 구조이지만, 여러 가지 중요한 프로그래밍 문제를 해결하는 데 유용하게 사용된다.


Code


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define M 10  // 스택의 최대 크기 정의

// 전역 변수 선언
int arr[M];  // 스택을 저장할 배열
int front;   // 스택의 top을 가리키는 변수

// 함수 선언
void Push();
void Pop();
void Stack_Empty();
void Stack_Full();
void Print_Stack();

int main(void) {
    int Sel = 0;

    // 메뉴를 출력하고 사용자의 선택을 처리하는 반복문
    do {
        printf(" --------------------\n");
        printf(" |    1.Push        |\n");
        printf(" |    2.Pop         |\n");
        printf(" |    3.Is_Empty?   |\n");
        printf(" |    4.Is_Full?    |\n");
        printf(" |    5.Print       |\n");
        printf(" --------------------\n");
        printf("Select Mode:");

        scanf("%d", &Sel);  // 사용자로부터 선택을 입력받음

        // 사용자가 선택한 옵션에 따라 함수 호출
        switch (Sel) {
        case 1: {
            Push();  // 스택에 값을 삽입
            break;
        }
        case 2: {
            Pop();   // 스택에서 값을 삭제
            break;
        }
        case 3: {
            Stack_Empty();  // 스택이 비어있는지 확인
            break;
        }
        case 4: {
            Stack_Full();   // 스택이 꽉 찼는지 확인
            break;
        }
        case 5: {
            Print_Stack();  // 스택의 모든 요소를 출력
            break;
        }
        }

    } while (Sel != -1);  // 사용자가 -1을 입력할 때까지 반복

    return 0;
}

// 스택에 값을 삽입하는 함수
void Push() {
    int S;
    printf("Input:");
    scanf("%d", &S);  // 사용자로부터 삽입할 값을 입력받음

    if (front < M) {  // 스택의 현재 위치가 최대 크기보다 작으면
        arr[front++] = S;  // 현재 위치에 값을 삽입하고 top을 증가
        printf("Value Inserted Successfully!\n");
    }
    else {
        printf("Stack is full!!!\n");  // 스택이 꽉 찬 경우
    }

    printf("\n\n");
    return;
}

// 스택에서 값을 삭제하는 함수
void Pop() {
    if (front > 0) {  // 스택에 값이 하나 이상 있을 경우
        printf("Value deleted Successfully!\n");
        front--;  // top을 감소시켜 가장 최근에 삽입된 값을 제거
    }
    else {
        printf("Stack is already empty!!\n");  // 스택이 비어있는 경우
    }

    printf("\n\n");
    return;
}

// 스택이 비어있는지 확인하는 함수
void Stack_Empty() {
    if (front == 0)  // top이 0일 경우 스택이 비어있는 상태
        printf("Stack is Empty!!\n");
    else
        printf("Stack is Not Empty!!\n");  // 스택에 값이 있는 경우

    printf("\n\n");
    return;
}

// 스택이 꽉 찼는지 확인하는 함수
void Stack_Full() {
    if (front == M)  // top이 최대 크기와 같을 경우 스택이 꽉 찬 상태
        printf("Stack is Full!!\n");
    else
        printf("Stack is Not Full!!\n");  // 스택에 여유 공간이 있는 경우

    printf("\n\n");
    return;
}

// 스택의 현재 상태를 출력하는 함수
void Print_Stack() {
    printf("Print Stack: ");
    for (int i = 0; i < front; i++)  // top까지의 모든 값을 출력
        printf("%d ", arr[i]);

    printf("\n\n");
    return;
}


다음에는 큐(Queue)에 대해서 알아보도록 하자.



   


   
   
   


   


    
    





profile
하고 싶은 개발을 지향하는 삶을 추구합니다:D

0개의 댓글