Stack

1854 ワード

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

int* Stack; //데이터를 저장할 장소. 필요한 만큼 동적할당 하기 위해 포인터로 선언함
//스택에 저장할 데이터와 같은 타입의 포인터를 선언하면 이 포인터가 곧 스택이 된다. (int* Stack and int Size)
int Size; //스택의 할당 크기
int Top; //스택의 현재 위치를 가리키는 값이며, 스택이 어디까지 차있는지를 기억한다.

void InitStack(int n)
{
	Size = n; //Size크기 만큼 메모리를 할당하여,
    Stack = (int*)malloc(sizeof(int) * Size); //Stack 포인터에 대입한다.
    //따라서 Stack은 Size크기의 정수형 배열이 되며 Size개의 정수를 저장할 수 있다.
    Top = -1; //최초 스택에는 아무런 데이터가 들어있지 않으므로 Top은 비어있다는 뜻인 -1로 초기화한다.
    //배열이 0부터 시작하기 때문에 0은 자료가 없는 상태가 아니라 하나 들어있는 상태이므로 비어있는 것과는 다르다.
}

void FreeStack();
{
	free(Stack); //스택을 파기화는데 동적할당된 메모리만 해제한다.
}

bool Push(int data) //스택에 데이터를 저장하는 함수. (Top 증가 && Top에 data 대입)
{
	if (Top < Size-1){ //Top이 스택의 마지막 요소보다 작을 때만 푸시한다.
    	Stack[++Top] = data; //데이터가 들어있는 탑을 먼저 1 증가시킨 후, 이 자리에 인수로 전달된 데이터를 집어넣는다.
        return true;
    }
    else
    	return false; //스택의 크기가 무한하지 않기 때문에 가득 차있으면 false를 리턴한다. => 스택 오버플로우
}

int Pop() //스택에 저장한 값을 빼내는 함수. (Top 위치값 읽기 && Top 1 감소)
{
	if (Top >= 0)
    	return Stack[Top--];
    else //(Top<0)
    	return -1; //스택이 텅 비어서 더 꺼낼 데이터가 없는 상태를 스택 언더플로우라 한다.
}

int main()
{
	InitStack(256);
    Push(8);
    Push(2);
    Push(0);
    printf("%d\n", Pop()); //0
    printf("%d\n", Pop()); //2
    printf("%d\n", Pop()); //8
    return 0;
}