본문 바로가기

컴퓨터/C언어

Stack 구현하기


1.  스택이란 ? 

스택(stack)은 모든 원소들의 삽입(insert)과 삭제(delete)가 리스트의 한쪽 끝에서만 수행되는 제한 조건을 가지는 선형 자료 구조(linear data structure)로서, 삽입과 삭제가 일어나는 리스트의 끝을 top이라 하고, 다른 한쪽 끝을 bottom이라 한다. 스택은 종종 pushdown stack이라고도 하는데, 스택의 top에 새로운 원소를 삽입하는 것을 push라 하고, 가장 최근에 삽입된 원소를 의미하는 스택의 top으로부터 한 원소를 제거하는 것을 pop이라 한다. 이와 같은 스택 연상은 항상 스택의 top에서 발생하므로 top 포인터의 값을 1씩 증가 또는 감소시킴으로써 수행된다.

[네이버 지식백과] 스택 [stack] (컴퓨터인터넷IT용어대사전, 2011.1.20, 일진사)


2. 필요한 변수

 1) 메뉴 선택 시 어떤 메뉴를 선택했는가를 입력받을 변수 choice

 2) PRINT할 때 for문에서 사용할 변수 p_i

 3)동적 배열을 할당할 포인터 배열 변수 num


3. 구현해야 할 함수

 1) PUSH : num에 데이터를 넣을 함수

 2) POP : num에 할당된 데이터와 공간을 해지시켜줄 함수

 3) PRINT : num에 있는 데이터를 화면에 출력시킬 함수 // 난 귀찮아서 안만듬ㅋ


4. 소스 

 #include <stdio.h>

#include <stdlib.h>

#define MAX 5


void PUSH();

void POP();

void PRINT();


int main(){

int choice ;

int i=0;

int p_i;


int * num[MAX];

while(1){


printf("<<<   메뉴선택   >>>\n");

printf("1.PUSH\t2.POP\t3.PRINT\t0.END\n");

printf("선택 : ");

scanf("%d",&choice);

switch(choice){

case 1:{


if(i>=MAX){

printf("----------------------------warning------------------------\n");

printf("더 이상 데이터를 넣을 수 없습니다.\n\n");

}else{

PUSH(i, num);

i++;

}

break;

}

case 2:{

--i;


if(i<0){

printf("----------------------------warning------------------------\n");

printf("삭제할 데이터가 없습니다.\n\n");

}else{

POP(i, num);

}

break;

}


case 3:{

for(p_i=0; p_i<i; p_i++){

printf("%d   ",*(num[p_i]));

}

if(i==0){

printf("데이터가 없습니다.\n");

}

printf("\n");

break;

}

case 0:{

printf("~Good Bye~\n");

return 0;

}

default:{

printf("잘못입력하셨습니다.\n");

continue;

}

}

}

}


void PUSH(int i, int * num[]){


int push_num=0;

num[i]= (int*)malloc(sizeof(int));

//size++;

printf("스택에 넣을 데이터 입력 : ");

scanf("%d",&push_num);


*(num[i])=push_num;

}

void POP(int i, int * num[]){

free(num[i]);

printf("데이터가 삭제되었습니다.\n");

}


5. 느낀점 

 그다지 어렵진 않았다. 근데 스택이 이게 맞나?ㅋㅋㅋ

 나중엔 교과서에서 배운것처럼 링크드리스트를 이용하여 구현해보자.