본문 바로가기
DSA

스택 (stack)

by KWONE 2024. 7. 22.

스택은 후입선출의 입출력형태를 나타낸다. (Last-in, First-out)

ADT 추상 자료형으로 스택을 나타내면 다음과 같다.

  • 객체: 0개 이상의 원소를 가지는 유한 선형 리스트
  • 연산:
    • create(size) ::= 최대 크기가 size인 공백 스택을 생성
    • is_full(s) :=  
    • is_empty(s)
    • push(s,item)
    • pop(s)
    • peek(s)

 

 

전역변수와 1차원 배열을 이용한 스택 구현

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

#define MAX_STACK_SIZE 100
typedef int element;
element stack[MAX_STACK_SIZE];
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;	//stack[0]부터 item 저장,top값이 하나 증가
	}
}
element pop()
{
	if (is_empty()) {
		fprintf(stderr, "스택 공백 에러\n");
		exit(1);
	}
	else {
		return stack[top--];	//stack[top]를 반환하고 top를 하나 감소
	}
}
element peek()
{
	if (is_empty()) {
		fprintf(stderr, "스택 공백 에러\n");
		exit(1);
	}
	else {
		return stack[top];	//stack[top]를 반환만 한다.
	}
}
int main()
{
	push(1);
	push(2);
	push(3);
	printf("%d\n", pop());
	printf("%d\n", pop());
	printf("%d\n", pop());
	return 0;
}

 

구조체를 이용한 스택 구현

typedef struct {
	int student_no;
	char name[MAX_STRING];
	char address[MAX_STRING];
} element;
element  stack[MAX_STACK_SIZE];

구조체 데이터를 함수의 매개변수로 전달할때는 그대로 전달하면 call by vallue기 때문에 반드시 포인터를 사용해야한다.

그리고 간접참조 연산자를 사용하여 데이터를 활용할때, 예를 들어 생성된 구조체 포인터s라고 하면 s->top 등으로 사용.

#include <stdio.h>
#include <stdlib.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)--];
}
// 피크함수
element peek(StackType *s)
{
	if (is_empty(s)) {
		fprintf(stderr, "스택 공백 에러\n");
		exit(1);
	}
	else return s->data[s->top];
}
// ===== 스택 코드의 끝 ===== 


int main(void)
{
	StackType t;	//스택을 정적으로 생성

	init_stack(&t);
	push(&t, 1);	//함수 호출할 때 스택의 주소를 전달한다.
	push(&t, 2);
	push(&t, 3);
	printf("%d\n", pop(&t));
	printf("%d\n", pop(&t));
	printf("%d\n", pop(&t));
}

 

'DSA' 카테고리의 다른 글

큐 (queue)  (0) 2024.07.23
동적 배열 스택  (0) 2024.07.22
기수 변환  (0) 2024.07.16
연결 리스트 예제  (0) 2024.07.14
연결 리스트 (linked list)  (0) 2024.07.13