본문 바로가기

자료구조

STACK 구현

스택은 예전에 Assembly 공부하면서 Study 함

 

참조 링크:

kjt9109.tistory.com/entry/5%EC%9E%A5%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80?category=825870

 

바로 소스로 들어가자

 

STACK API

#define STACK_SIZE 50

typedef int Data;

typedef struct __Stack
{
	int buf[STACK_SIZE];
	int stack_ptr;

} Stack;

void StackInit(Stack *pstack);
void Show_Stack(Stack *pstack);
void SPush(Stack *pstack, Data data);

int sIsEmpty(Stack *pstack);

Data SPop(Stack *pstack);
Data SPeek(Stack *pstack);

 

StackInit

스택 버퍼 및 스택포인터를 초기화한다.

버퍼는 0으로, 포인터는 -1로 초기화 한다.

 

Show_Stack

스택 버퍼를 확인 할 수 있도록 출력한다.

 

SPush

스택에 데이터를 추가한다.

 

SPop

스택의 데이터를 제거한다. (스택포인터를 기준으로)

 

SPeek

스택포인터 위치의 데이터를 확인한다.

 

 

Stack.c

#include "stack.h"

void StackInit(Stack *pstack)
{

	for (int i = 0; i < STACK_SIZE; i++)
	{
		pstack->buf[i] = 0;
	}


	pstack->stack_ptr = -1;
}

int sIsEmpty(Stack *pstack)
{
	return pstack->stack_ptr;
}

void Show_Stack(Stack *pstack)
{
	printf("Show Stack \r\n");

	for(int i = 0; i < STACK_SIZE; i++)
	{
		printf("%d ", pstack->buf[i]);
	}
	printf("\r\n");
}

void SPush(Stack *pstack, Data data)
{
	pstack->stack_ptr++;

	if (pstack->stack_ptr < STACK_SIZE)
	{
		printf("Push Stack \r\n");
		pstack->buf[pstack->stack_ptr] = data;
	}
	else
	{
		printf("Stack is Full \r\n");
		pstack->stack_ptr--;
	}
}

Data SPop(Stack *pstack)
{
	Data local_buf;

	if (sIsEmpty(pstack) < 0)
	{
		printf("Stack is Empty \r\n");
		return -1;
	}
	else
	{
		local_buf = pstack->buf[pstack->stack_ptr];
		pstack->buf[pstack->stack_ptr--] = 0;

		return local_buf;
	}
}

Data SPeek(Stack *pstack)
{
	if (sIsEmpty(pstack) < 0)
	{
		printf("Stack is Empty \r\n");
		return -1;
	}
	else
	{
		return pstack->buf[pstack->stack_ptr];
	}

}

 

Main 함수에서는 간단하게 Push, Pop을 활용하여 출력하였다.

 

main.c


#include "stack.h"

int main(void)
{

	Stack Local_Stack;

	StackInit(&Local_Stack);

	printf("hello world \r\n");

	SPush(&Local_Stack, (Data) 1);
	SPush(&Local_Stack, (Data) 2);
	SPush(&Local_Stack, (Data) 3);
	SPush(&Local_Stack, (Data) 4);
	SPush(&Local_Stack, (Data) 5);

	Show_Stack(&Local_Stack);

	printf("View Pop %d\n", SPop(&Local_Stack));
	printf("View Pop %d\n", SPop(&Local_Stack));
	printf("View Pop %d\n", SPop(&Local_Stack));

	Show_Stack(&Local_Stack);

	printf("View Peek %d\n", SPeek(&Local_Stack));
	printf("View Peek %d\n", SPeek(&Local_Stack));
	printf("View Peek %d\n", SPeek(&Local_Stack));

	Show_Stack(&Local_Stack);

	printf("View Pop %d\n", SPop(&Local_Stack));
	printf("View Pop %d\n", SPop(&Local_Stack));
	printf("View Pop %d\n", SPop(&Local_Stack));
	printf("View Pop %d\n", SPop(&Local_Stack));
	printf("View Pop %d\n", SPop(&Local_Stack));
	printf("View Pop %d\n", SPop(&Local_Stack));

	Show_Stack(&Local_Stack);

	SPush(&Local_Stack, (Data) 7);
	SPush(&Local_Stack, (Data) 8);
	SPush(&Local_Stack, (Data) 9);
	SPush(&Local_Stack, (Data) 10);
	SPush(&Local_Stack, (Data) 11);

	Show_Stack(&Local_Stack);

	return 0;

}

 

실행화면

 

'자료구조' 카테고리의 다른 글

Stack - 후위표기법 -1(변환)  (0) 2020.11.12
Stack - 중위표기법 (괄호 x)  (0) 2020.11.10
연결리스트 #2 리스트 추가기능  (0) 2020.10.16
연결 리스트 #1 구현  (0) 2020.10.15
배열 리스트  (0) 2020.10.10