본문 바로가기
CS/자료구조

Fundamentals of Data Structure - ADT 3.1

by 하늘노을 2015. 7. 30.
Stack ADT 정의파일
//
//  Stack.c
//  Stack
//
//  Created by Skia on 2015. 7. 30..
//  Copyright (c) 2015년 Skia. All rights reserved.
//

#include "Stack.h"


void CreateS(Stack* stack){
    stack->top = -1;
}

Bool IsEmpty(Stack* stack){
    if ( stack->top < 0 ) {
        return TRUE;
    }
    return FALSE;
}

Bool IsFull(Stack* stack){
    if(stack->top >= MAX_STACK_SIZE-1){
        return TRUE;
    }
    return FALSE;
}// top >= MAX_STACK_SIZE-1

void Push(Stack* stack, element item){
    if(IsFull(stack)){
        fprintf(stderr, "Error! Stack is FULL\n");
    }
    else{
        stack->item[++stack->top] = item;
    }
}

element Pop(Stack* stack){
    element temp;
    
    if(IsEmpty(stack)){
        fprintf(stderr, "Error! Stack is EMPTY\n");
    }
    else{
        temp = stack->item[stack->top];
        stack->item[stack->top].key = 0;
        stack->top--;
    }
    
    return temp;
}

Stack ADT 헤더파일
//
//  Stack.h
//  Stack
//
//  Created by Skia on 2015. 7. 30..
//  Copyright (c) 2015년 Skia. All rights reserved.
//

#ifndef __Stack__Stack__
#define __Stack__Stack__

#include <stdio.h>
#include <stdlib.h>

#define MAX_STACK_SIZE 4 /* maximum stack size */


typedef enum { FALSE = 0, TRUE = 1} Bool;

typedef struct {
    int key;
    char name[10];
    /* other fields*/
}element;

typedef struct {
    int top;
    element item[MAX_STACK_SIZE];
}Stack;

void CreateS(Stack* stack);
Bool IsEmpty(Stack* stack); // top < 0
Bool IsFull(Stack* stack); // top >= MAX_STACK_SIZE-1
void Push(Stack* stack, element item);
element Pop(Stack* stack);



#endif /* defined(__Stack__Stack__) */

Main , ADT 테스트 파일
//
//  main.c
//  Stack
//
//  Created by Skia on 2015. 7. 30..
//  Copyright (c) 2015년 Skia. All rights reserved.
//

#include "Stack.h"
#include <string.h>

int main(int argc, const char * argv[]) {
    Stack stack;
    element item;
    int i;
    
    CreateS(&stack);
    
    item.key = 10;
    strcpy(item.name,"Vincent");
    Push(&stack, item);
    
    item.key = 12;
    strcpy(item.name,"Penny");
    Push(&stack, item);
    
    item.key = 3;
    strcpy(item.name,"Finn");
    Push(&stack, item);
    
    item.key = 5;
    strcpy(item.name,"Jake");
    Push(&stack, item);
    
    
    printf("Current top : %d\n",stack.top);
    
    for (i = 0; i < stack.top+1; i++){
        printf("stack [%d] key : %d / name : %s", i,stack.item[i].key,stack.item[i].name);
        printf("\n");
    }
    
    item.key = 7;
    strcpy(item.name,"Zedd");
    Push(&stack, item);
    
    printf("\nNow we're goonna retrive a data\n");
    
    Pop(&stack);
    Pop(&stack);

    printf("Current top : %d\n",stack.top);
    
    for (i = 0; i < stack.top+1; i++){
        printf("stack [%d] key : %d / name : %s", i,stack.item[i].key,stack.item[i].name);
        printf("\n");
    }
    
    Pop(&stack);
    Pop(&stack);
    Pop(&stack);
    
    
    
    return 0;
}

실행결과 : 

Current top : 3

stack [0] key : 10 / name : Vincent

stack [1] key : 12 / name : Penny

stack [2] key : 3 / name : Finn

stack [3] key : 5 / name : Jake

Error! Stack is FULL


Now we're goonna retrive a data

Current top : 1

stack [0] key : 10 / name : Vincent

stack [1] key : 12 / name : Penny

Error! Stack is EMPTY


책에서는 Stack ADT를 Global Area에 정의하였다. 

하지만 이는 추후에 사용하기 어렵다는 점을 고려하여 지역변수로 설정하게끔 struct를 하나 더 정의하고 기타 몇몇 부분 수정하였다.

또한 함수를 정의할 때 변수 변경의 용이성을 위해 주소를 통해 값을 전달하게끔 하였다.