#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct nodetype{ // 자료 묶음
int data;
}node;
typedef struct Astack_type{ // stack의 형식
int max;
int count;
node *data_ptr;
}stack;
stack *makestack(int max){ // stack을 생성하는 함수입니다.
stack *returnstack; // 반환한 스택을 만든후
returnstack = (stack *)malloc(sizeof(stack)); // 메모리 할당을 한후
if( returnstack != NULL ){ // 동적 할당이 잘되었는지 확인 후
returnstack -> count = 0; // 반환할 스택에 들어가야할 값을 입력합니다.
returnstack -> max = max;
returnstack -> data_ptr = (node *)malloc(sizeof(node)*max); // 원하는 크기의 배열을 생성후
if( returnstack -> data_ptr != NULL ){ // 메모리 할당이 잘되었는지 확인후
memset(returnstack -> data_ptr,0,sizeof(node)*max); // 배열의 값을 0으로 모두 초기화합니다.
return returnstack; // 마지막으로 생성된 stack을 반환합니다.
}else{
printf("Error! Memory\n");
return 0;
}
printf("Error! Memory\n");
return 0;
}
return 0;
}
void Push(stack *s,node d){ // 자료를 입력하는... stack에서 자료를 쌓는 함수입니다.
if ( s -> count < s -> max ){ // 스택이 꽉 찼는지 확인을 한 후
s -> data_ptr[s->count] = d; // 스택의 마지막 위치에 자료를 입력합니다.
s -> count++; // 저장된 자료양을 한단계 올립니다.
return ;
}else{
printf("Error! Data is Full\n");
}
}
node Pop(stack *s){ // 자료를 삭제하는... stack에서 자료를 제거/반환하는 함수입니다.
if ( s -> count > 0 ){ // 스택이 비었느지 확인을 한 후
node returnnode = s -> data_ptr[s->count-1]; // 제거/반환될 자료를 저장하고
s -> data_ptr[s->count-1].data = 0; // 제거될 자료를 0으로 초기화한 후
s -> count--; // 저장된 자료양을 한단계 낮춥니다.
return returnnode; // 후에 저장된 자료를 반환해줍니다.
}else{
printf("Error! Data is Empty\n");
}
}
node Peek(stack *s){ // 최상위층의 자료를 반환해주는 함수입니다.
if ( s -> count > 0 ){
node returnnode = s -> data_ptr[s->count-1];
return returnnode;
}else{
printf("Error! Data is Empty\n");
}
}
// Pop함수와 같지만, 자료를 삭제하지는 않는 다는 것!!
void Display(stack *s){ // 스택의 모든 것을 출력합니다.
int i;
for ( i = s -> count ; i > 0 ; i-- ){
printf("%d층 자료값 : %d\n",i,s->data_ptr[i-1].data);
}
}
// stack층에 맞게 보이기 위해서 역순으로 출력하게 했습니다.
int main(){
stack *Astack;
int max_data;
printf("스택의 크기를 정해주십시요 : ");
scanf("%d",&max_data);
Astack = makestack(max_data);
printf("\n\n%d개를 저장할 수 있는 Stack 자료구조가 생성되었습니다.\n",max_data);
while(1){
int select;
node data_node;
printf("\n\n현재 %d개의 자료가 저장되있습니다\n",Astack -> count);
printf("기능을 선택해주시기 바랍니다.\n1.자료 저장\t2.자료 삭제\t3.자료 반환\t4.자료 보기\t5.종료\n");
scanf("%d",&select);
switch(select){
case 1 :
printf("데이터를 입력해주시기 바랍니다 : ");
scanf("%d",&data_node.data);
Push(Astack,data_node);
break;
case 2:
data_node = Pop(Astack);
printf("Pop data : %d\n",data_node.data);
break;
case 3:
data_node = Peek(Astack);
printf("Peek data : %d\n",data_node.data);
break;
case 4:
Display(Astack);
break;
case 5:
if ( Astack != NULL ){
free(Astack -> data_ptr);
free(Astack);
}
return ;
default:
printf("You select other number\n");
break;
}
}
}
----------------------------------------------------------------------------------------------------
역시 리스트보다 쉬운 느낌이 팍팍 드는 스택입니다.
특수한 자료구조 형식에 의해 복잡도가 떨어진다는 의미이죠~
but, 리스트보단 활용 범위가 큰!! =_=;;
일단, 포인터를 이용하여 stack을 구현후 천천히
사용처를 알아보도록 합시다~