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