프로그래밍[Univ]/데이터구조

[스택] 배열을 이용한 스택 구현 5/27

Cloud Travel 2011. 5. 27. 11:25

#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을 구현후 천천히

사용처를 알아보도록 합시다~