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