본문 바로가기
CS/자료구조

[자료구조] Stack

by 개발도사(진) 2023. 9. 11.

LIFO(Last-In First-Out, 후입선출법) 원칙에 따라 element를 삽입/제거하는 자료구조.


말 그대로 가장 늦게 들어간 element가 가장 먼저 뽑혀 나온다. 패스트푸트점에서 컵 반납하는 스프링 통을 생각하면 편할 것이다. 

다음에 포스팅할 Queue와 마찬가지로 자료구조의 한 쪽 끝에서만 삽입/삭제 연산이 이루어지고, 이 최상위 노드의 위치를 가리키는 변수가 있어야 한다. 본 포스팅에서는 이를 'top'이라고 할 것이다.

Stack에 사용되는 연산은 아래와 같다.

1. push(e): element e를 stack의 맨 위에 삽입.

2. pop(): 맨 위의 element를(=가장 늦게 삽입된 element)를 반환하고 제거

3. top() : 맨 위에 element를 '제거하지 않고' 참조

4. isEmpty(): stack이 비었는지 확인

5. size(): stack 내 element 갯수.

해당 연산은 모두 O(1) 시간에 수행 가능하다. 처음에는 size 연산의 경우에 stack 전체를 순회해야 하기 때문에 O(n) 시간이 필요한 것 아닌가 하는 의문이 있었다. 하지만 stack에서는 연산이 이루어질 끝 지점을 지시하는 top 변수가 필요하고, 이 변수의 위치에 따라 해당 stack에 몇 개의 원소가 있는지 알 수 있기 때문에 O(1) 시간에 수행 가능한 것으로 이해하였다.

Array-Based Stack

array를 기반으로 stack을 구현한 것. array는 길이가 고정된 자료구조이기 때문에 array 기반으로 stack을 구현하면 storage 크기가 제한된다는 단점이 있지만 구현이 간편하다.

#include <iostream>
class Custom_stack
{
private:
    int maxSize;
    int top;
    int *stack;

public:
    Custom_stack()
    {
        maxSize = 10000;
        top = -1;
        stack = new int[maxSize];
    }

    void Push(int e)
    {
        if (top >= maxSize)
        {
            std::cout << "FULL STACK\n";
            return;
        }

        stack[++top] = e;
    }

    int Pop(int e)
    {
        if (top == -1)
        {
            std::cout << "Empty Stack\n";
            return -1;
        }

        int result = stack[top--];
        return result;
    }

    int Top()
    {
        if (top == -1)
        {
            std::cout << "Empty Stack\n";
            return -1;
        }

        return stack[top];
    }

    int Size()
    {
        return (top + 1);
    }

    bool IsEmpty()
    {
        if (top==-1)
            return true;
        else
            return false;
    }
};

C++로 간단히 array-based stack을 만들어 봤다.

 

사실 C++ STL에서 제공하는 stack과는 좀 다른데, C++에서 제공하는 stack의 경우 pop연산이 '맨 위의 원소를 반환하고 stack에서 제거' 하는 연산이 아니라 '맨 위의 원소를 제거' 하는 연산이라서, 전자의 의미를 구현하려면 다음과 같이 해야 한다.

int result = stack.top();
stack.pop();

 또, 우리가 흔히 stack을 이해할 때 접시 쌓듯이 이미지를 연상하기 때문에 "맨 위에 있는 element" 라고 표현했지만, 코드에서 볼 수 있듯 실제로는 "맨 끝"에 있다. 

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

[자료구조] Tree  (0) 2023.09.16
[자료구조] Queue  (0) 2023.09.13
[자료구조] Circularly Linked List  (0) 2023.09.05
[자료구조] Doubly Linked List  (0) 2023.09.04
[자료구조] Singly Linked List  (0) 2023.07.29