7.13.2017

자료구조 stack - 배열로

//스택 : 후입선출
//큐 : 선입선출
//배열로 스택 구현
//pust (삽입), pop(제거)

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

typedef struct tagNode {
        int Data;
}Node;

// 배열의 용량, 최상위 노드의 위치, 노드의 배열

typedef struct tagArrayStack {
        int Capacity; // 용량
        int Top; // 최상위 노드위치
        Node *Nodes; // 노드 배열
}ArrayStack;

void CreateStack(ArrayStack** Stack, int Capacity) {
        // 스택을 자유 저장소에 생성
        (*Stack) = (ArrayStack*)malloc(sizeof(ArrayStack));

        //입력된 Capacity만큼 노드를 자유 저장소에 생성
        (*Stack)->Nodes = (Node*)malloc(sizeof(Node)*Capacity);

        //Capacity 및 Top 초기화
        (*Stack)->Capacity = Capacity;
        (*Stack)->Top = 0;

}

void DestroyStack(ArrayStack* Stack) {
        //노드를 자유 저장소에서 해제
        free(Stack->Nodes);
        //스택을 자유 저장소에서 해제
        free(Stack);
}

void Push(ArrayStack* Stack, int Data) {
        int Position = Stack->Top;
        Stack->Nodes[Position].Data = Data;
        Stack->Top++;
}

int Pop(ArrayStack* Stack) {
        int Position = --(Stack->Top);
        /*Stack->Top = Stack->Top-1;
        int Position = Stack->Top;
        */
        return Stack->Nodes[Position].Data;
}

int Top(ArrayStack* Stack) {
        int Position = Stack->Top-1;
        return Stack->Nodes[Position].Data;
}

int GetSize(ArrayStack* Stack) {
        return Stack->Top;
}
int IsEmpty(ArrayStack* Stack) {
        return(Stack->Top == 0);
}
void main() {
        ArrayStack* Stack = NULL;
        CreateStack(&Stack, 10);
        Push(Stack, 3);
        Push(Stack, 37);
        Push(Stack, 11);
        Push(Stack, 12);

        printf("Capacity : %d, Size : %d, Top : %d\n\n", Stack->Capacity, GetSize(Stack), Top);

        for (int i = 0; i < 4; i++) {
                if (IsEmpty(Stack)) break;
printf("Popped: %d, ", Pop(Stack));
/*
IsEmpty 값이 있을 때 : 0
IsEMpty 값이 없을 때 : 1
*/

if (!IsEmpty(Stack))
printf("Current Top : %d\n", Top(Stack));
else printf("Stack is Empty.\n");
}
DestroyStack(Stack);

system("pause");
}

댓글 없음:

댓글 쓰기