Develop2021-03-234 min read

스택(Stack) 이란

1. 스택(Stack) 이란 후입선출(Last In First Out - LIFO)의 특성을 가지는 자료구조를 일컫는다. 메모리에 새로 들어오는 데이터의 위치가 메모리의 말단(탑 포인터)이고 내보내는 데이터 역시 메모리 말단을 거친다.

바닥이 막혀 차례로 쌓아야 하는 상자를 생각하면 편하다.▲ 바닥이 막혀 차례로 쌓아야 하는 상자를 생각하면 편하다.

2. 구성 요소 생각하기

함수 우선, 가장 기본적으로 스택에 데이터를 넣어주는 함수가 필요하다. (Push) 또 데이터를 추출하는 함수도 필요하다. (Pop) 마지막으로 스택을 출력하는 함수도 필요하다. (Print)

배열 데이터를 받을 배열이 필요하다. (Stack) 또 데이터가 들어왔는지 체크할 배열도 필요하다. (StackCount)

변수 데이터가 들어오고 나가고를 관리할 변수 하나가 필요하다. (temp)

3. 소스코드

c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h> //c++에선 <cctype.h>
#include <stdbool.h>
 
#define TRUE 1
#define FALSE 0
 
int Stack[5] = {0,}; //스택 배열
int StackCount[5] = {FALSE,}; //내용이 있는지 확인
int temp; //스택 명령 처리용 변수
 
int pop(); //가장 위에 있는 내용 추출 함수
int push(); //가장 위에 내용 추가 함수
int printStack(); //스택 출력 함수
 
void main() {
    bool roop = true; //루프 여부
    printf("Hello!! Welcome to EHd's Stack example!!\n");
    printf("You can Push, Pop, Print of Stack.\n\n");
    while (roop) {
        int play; //행동 입력받기용 변수
        printf("1 -> Push    2 -> Pop    3 -> Print    4 -> Exit    5 -> Erase\n");
        printf("Please enter the number :: ");
        scanf_s("%d", &play); //행동 입력받기
 
        if (play < 1 || play > 5)
            continue;
 
        switch (play)
        {
        case 1:
            push();
            break;
        case 2:
            pop();
            break;
        case 3:
            printStack();
            break;
        case 4:
            printf("Exit_\n");
            _getch();
            roop = false;
            break;
        case 5:
            system("cls");
            break;
        }
    }
}
 
int push() {
    if (temp < 5) {
        if (StackCount[temp] == FALSE) {
            printf("Push_ :: Please Enter the Number :: ");
            scanf("%d", &Stack[temp]);
            StackCount[temp] = TRUE;
            temp++;
        }
    }
    else {
        printf("Error!! Stack is Overflow!!\n");
    }
 
    printf("\n");
    return 0;
}
 
int pop() {
    if (temp > 0) {
        temp--;
        Stack[temp] = NULL;
        StackCount[temp] = FALSE;
        printf("Pop_ :: Succeed!!");
    }
    else
        printf("Stack im Empty!!");
 
    printf("\n\n");
    return 0;
}
 
int printStack() {
    printf("Print Stack_ :: ");
    for (int i = 0; i < 5; i++) {
        //printf("%d ",i);
        if (StackCount[i] == TRUE) {
            printf("[%d]    ",Stack[i]);
        }
        else {
            printf("NULL    ");
        }
    }
 
    printf("\n\n");
    return 0;
}
CData Structure