스택

Onni·2022년 2월 24일
0

✅ 스택이란?

스택의 형태를 이해하기 위해서는 프링글스 통을 생각하면 편하다. 우리는 프링글스 통에서 과자를 빼어먹을 때 가장 맨 위에 있는 과자를 빼어먹으며, 과자를 넣을 때도 맨 위에 과자를 넣게 된다. 가장 늦게 들어온 것이 가장 첫번째로 나가는 형태이므로 이런 입출력 형태를 LIFO(Last-In First-Out)이라고 한다.

스택의 형태를 그림으로 나타낸 것이다. 스택에 있는 1, 2, 3을 스택의 요소라고 부르며, 가장 위에 있는 요소는 스택의 상단(top)이라 부른다.
또한, 스택에 요소가 하나도 들어있지 않을 때는 공백(empty) 상태라 하고 꽉 차서 더 이상 요소를 집어넣지 못하 경우 포화(full) 상태라고 한다.

다음과 같이 스택의 top 요소를 빼오는 연산을 pop, 스택에 top에 새로운 요소를 추가하는 연산을 push라고 한다. pop의 경우 스택이 공백(empty) 상태인지 확인해야 하며, push의 경우 스택이 포화(full) 상태인지 확인해야 한다.

✅ 소스 코드 구현

#include <stdbool.h>

#ifndef _STACK_
#define _STACK_

typedef struct stack {
        int* element;
        int size;
        int top;
} stack;
typedef stack* Stack;

Stack createStack(int n);
bool isFull(Stack stack);
void push(Stack stack, int elem);
bool isEmpty(Stack stack);
int pop(Stack stack);
int peek(Stack stack);
void printStack(Stack stack);

#endif

✔ stack.c

Stack createStack(int n) {
    Stack stack = (Stack)malloc(sizeof(Stack));
    stack->element = (int*)malloc(sizeof(int) * n);
    stack->size = n;
    stack->top = -1;

    return stack;
}

bool isFull(Stack stack) {
    if (stack->top == stack->size - 1)
        return true;
    else
        return false;
}

void push(Stack stack, int elem) {
    if (!isFull(stack)) {
        stack->top++;
        stack->element[stack->top] = elem;
    }
}

bool isEmpty(Stack stack) {
    if (stack->top == -1)
        return true;
    else
        return false;
}

int pop(Stack stack) {
    if (!isEmpty(stack)) {
        return stack->element[stack->top--];
    }
}

int peek(Stack stack) {
    if (!isEmpty(stack)) {
        return stack->element[stack->top];
    }
}

void printStack(Stack stack) {
    for (int i = 0; i < stack->top + 1; i++) {
        printf("%d ", stack->element[i]);
    }
    printf("\n");
}

🧩 Reference

profile
꿈꿈

0개의 댓글