본문 바로가기
자료구조

[자료구조] 스택(Stack)

by 유일리 2022. 10. 19.

 

스택이란?

스택은 쌓아놓은 더미라는 뜻으로, 가장 최근에 들어온 데이터가 가장 먼저 나가는 후입선출(LIFO:Last-In First-Out)의 형태이다. 

스택의 연산
  • push(): 스택에 데이터를 추가
  • pop(): 스택에서 데이터를 삭제
  • is_empty(s): 스택이 공백상태인지 검사
  • is_full(s): 스택이 포화상태인지 검사
  • create(): 스택을 생성
  • peek(s): 요소를 스택에서 삭제하지 않고 보기만 하는 연산
배열을 이용한 스택
  • 1차원 배열 stack[]
  • 스택에서 가장 최근에 입력되었던 자료를 가리키는 top 변수
  • ¨가장 먼저 들어온 요소는 stack[0], 가장 최근에 들어온 요소는 stack[top]에 저장
  • 스택이 공백상태이면 top은 -1
전역 변수로 구현하는 방법
#include <stdio.h>
#include <stdlib.h>

#define MAX_STACK_SIZE 100	// 스택의 최대 크기
typedef int element;		// 데이터의 자료형
element  stack[MAX_STACK_SIZE]; // 1차원 배열
int  top = -1;

// 공백 상태 검출 함수
int is_empty()
{
	return (top == -1);
}
// 포화 상태 검출 함수
int is_full()
{
	return (top == (MAX_STACK_SIZE - 1));
}
// 삽입 함수
void push(element item)
{
	if (is_full()) {
		fprintf(stderr, "스택 포화 에러\n");
		return;
	}
	else stack[++top] = item;
}
// 삭제 함수
element pop()
{
	if (is_empty()) {
		fprintf(stderr, "스택 공백 에러\n");
		exit(1);
	}
	else return stack[top--];
}
int main(void)
{
	push(1);
	push(2);
	push(3);
	printf("%d\n", pop());
	printf("%d\n", pop());
	printf("%d\n", pop());
	return 0;
}

구조체 배열 사용하기
#include <stdio.h>
#define MAX_STACK_SIZE 100
typedef int element;
typedef struct {
	element data[MAX_STACK_SIZE];
	int top;
} StackType;

// 스택 초기화 함수
void init_stack(StackType* s)
{
	s->top = -1;
}

// 공백 상태 검출 함수
int is_empty(StackType* s)
{
	return (s->top == -1);
}
// 포화 상태 검출 함수
int is_full(StackType* s)
{
	return (s->top == (MAX_STACK_SIZE - 1));
}
// 삽입함수
void push(StackType* s, element item)
{
	if (is_full(s)) {
		fprintf(stderr, "스택 포화 에러\n");
		return;
	}
	else s->data[++(s->top)] = item;
}
// 삭제함수
element pop(StackType* s)
{
	if (is_empty(s)) {
		fprintf(stderr, "스택 공백 에러\n");
		exit(1);
	}
	else return s->data[(s->top)--];
}
int main(void)
{
	StackType s;

	init_stack(&s);
	push(&s, 1);
	push(&s, 2);
	push(&s, 3);
	printf("%d\n", pop(&s));
	printf("%d\n", pop(&s));
	printf("%d\n", pop(&s));
}

댓글