프로그래밍

연결 자료구조를 이용하여 구현한 스택 프로그램

Dilrong 2013. 11. 19. 13:42
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h>
 
//int를 스택 element의 자료형으로 정의 
//이유 다른 자료형을 사용하기 편하게 하기 위해 
typedef int element;
 
//스택의 노드 구조 정의 
typedef struct stackNode {
     //정수형 타입 데이터(데이터 필드) 
    element data; 
    //노드 포인터(링크 필드) 
    struct stackNode *link; 
}stackNode; 

//스택의 top노드를 지정하기 위한 포인터 top 선언 
stackNode* top; 

//스택 삽입 연산 
void push(element item) 
{ 
    //메모리 할당(할당한 주소 temp에 넣음) 
    stackNode* temp=(stackNode *)malloc(sizeof(stackNode));
     //데이터를 temp의 데이터필드 에 넣음 
    temp -> data = item; 
    //tmep의 주소를 top에 넣어줌 
    temp -> link = top; 
    top = temp; 
} 

//스택의 삭제 후 반환 연산 
element pop() 
{ 
    element item; 
    stackNode* temp=top; 

    //현재 스택이 공백 리스트인 경우 
    if(top == NULL) {
         printf("\n\n Stack is empty !\n");
         return 0;
     } 
    //현재 스택이 공백 리스트가 아닌 경우 
    else{ 
        //item에 temp의 데이터를 줌 
        item = temp->data; 
        //top에 temp의 링크를 줌(밑의 원소를 가르키게 됨) 
        top = temp->link; 
        //메모리에서 삭제 
        free(temp); 
        //자료값 리턴 
        return item; 
    } 
} 

//스택의 top 원소 검색 연산 
element peek() 
{ 
    element item; 
    //현재 스택이 공백 리스트인 경우 
    if(top == NULL) {
         printf("\n\n Stack is empty ! \n");
         return 0;
     } 
    //현재 스택이 공백 리스트가 아닌 경우 
    else { 
        //top의값을 item에 넣어줌 
        item = top->data; 
        //top의 값 리턴 
        return item; 
    } 
} 

//스택의 삭제 연산(리턴 X) 
void del() 
{ 
    stackNode* temp; 
    //현재 스택이 공백 리스트인 경우 
    if(top == NULL) {
         printf("\n\n Stack is empty !\n");
     } 
    //현재 스택이 공백 리스트가 아닌 경우 
    else { 
        temp = top; 
        top = top->link; 
        //메모리 삭제 
        free(temp); 
    } 
} 

//스택의 내용 출력 연산 
void printStack() 
{ 
    //p는 top이랑 같음 
    stackNode* p=top; 
    printf("\n STACK [ "); 
    //NULL이 아닐때 까지 
    while(p){ 
        printf("%d ",p->data); 
        //다음 주소로 
        p = p->link; 
    } 
    printf("] "); 
} 

void main(void)
 { 
    //초기값 item선언, top은 NULL로 초기화 
    element item; 
    top = NULL; 

    printStack(); 
    push(1); 
    printStack(); 
    push(2); 
    printStack(); 
    push(3); 
    printStack(); 

    item = peek(); 
    printStack(); 
    printf("peek top => %d", item); 

    del(); 
    printStack(); 

    item = pop(); 
    printStack(); 
    printf("\t pop top => %d", item); 

    item = pop(); 
    printStack(); 
    printf("\t pop top => %d", item); 

    pop(); 

    getchar(); 
}
반응형