자료구조

자료구조 - 스택

tita 2024. 6. 6. 14:42

[스택(Stack)]

스택(Stack)은 후입선출(Last-In, First-Out, LIFO) 방식의 자료구조로, 데이터를 저장하고 접근하는데 사용됩니다.

이 자료구조는 데이터를 넣는(push) 작업과 데이터를 빼내는(pop) 작업을 지원합니다.

C++에서는 표준 라이브러리의 std::stack 클래스를 사용하여 스택을 구현할 수 있습니다.

 

 

 

[스택의 개념]

 

개념 설명

  • 스택은 한쪽 끝에서만 데이터를 삽입하고 삭제할 수 있는 자료구조입니다.
  • 가장 최근에 삽입된 항목이 가장 먼저 삭제됩니다.
  • 주요 연산은 push (데이터 삽입), pop (데이터 삭제), top (가장 최근에 삽입된 데이터 접근) 입니다.
  • top은 초기값이 -1 입니다.

 

스택의 구조

  • 배열이나 연결 리스트 등으로 구현될 수 있습니다.
  • 배열로 구현할 경우 크기가 고정되어 있거나 동적으로 크기를 조절할 수 있습니다.

 

 

[스택의 추상 자료형(ADT)]

스택은 다음과 같은 연산들로 추상화할 수 있습니다.

 

<is_empty> : 스택이 비어있는지 확인합니다.

top이 가장 최근에 삽입된 데이터를 가리키기 때문에 top을 사용해서 확인합니다.

is_empty(S):
    if top == -1
        then return TRUE
        else return FALSE

 

<is_full> : 스택이 가득 차 있는지 확인합니다.

top >= (MAX_STACK_SIZE - 1) 이면 스택이 꽉 차 있습니다.

is_full(S):
    if top >= (MAX_STACK_SIZE - 1)
        then return TRUE
        else return FALSE

 

<push> : 스택의 맨 위에 요소를 삽입합니다.

top을 증가시키고나서 요소를 삽입해야 합니다. 그렇지 않으면 마지막 요소가 지워지게 됩니다.

push(S, x):
    if is_full(S)
        then error "overflow"
        else top<-top+1
            stack[top]<-x

 

<pop> : 스택의 맨 위에 요소를 삭제합니다.

스택이 비어있지 않으면 top이 가리키는 값을 반환하고 top을 하나 감소시킵니다.

pop(S, x):
    if is_empty(S)
        then error "underflow"
        else e<-stack[top]
            top<-top-1
            return e

 

<peek> : 스택의 맨 위 요소를 제거하지 않고 반환합니다.

peek(S)
    if(is_empty(S))
        return ERROR_STACK_EMPTY;
    else
    	return 마지막 요소 삭제하지 않고 반환

 

배열을 사용하는 스택을 구현해보면 다음과 같습니다.

#include <iostream>

#define MAX_SIZE 100

class Stack 
{
    private:
        int arr[MAX_SIZE];
        int top;

    public:
        Stack() 
        {
            top = -1;
        }

        bool isEmpty() 
        {
            return (top == -1);
        }

        bool isFull() 
        {
            return (top == MAX_SIZE - 1);
        }

        void push(int value)
        {
            if (isFull()) 
            {
                std::cout << "Stack overflow!" << std::endl;
                return;
            }
            arr[++top] = value;
        }

        void pop() 
        {
            if (isEmpty())
            {
                std::cout << "Stack underflow!" << std::endl;
                return;
            }
            top--;
        }

        int peek() 
        {
            if (isEmpty()) 
            {
                std::cout << "Stack is empty!" << std::endl;
                return -1;
            }
            return arr[top];
        }
};        

int main() 
{
    Stack myStack;

    // 스택에 데이터 삽입
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 스택의 가장 위(top) 요소 확인
    std::cout << "Top element of the stack: " << myStack.peek() << std::endl;

    // 스택에서 데이터 삭제
    myStack.pop();

    // 스택이 비어있는지 확인
    if (myStack.isEmpty()) 
    {
        std::cout << "Stack is empty." << std::endl;
    } 
    else 
    {
        std::cout << "Stack is not empty." << std::endl;
    }

    return 0;
}