본문 바로가기

DEVELOPMENT/Algorithm

스택(Stack)

반응형

스택 Stack 은 데이터를 한쪽 방향으로만 넣고 빼는 자료구조다.
가장 나중에 들어온 데이터가 가장 먼저 나가는 후입선출 LIFO, Last In First Out 구조를 가진다.
즉, 접시를 쌓아두는 것처럼 위에 쌓은 접시부터 먼저 꺼내는 방식이다.


스택의 주요 연산

  1. 푸시 Push
    스택의 맨 위에 데이터를 추가한다.
  2. 팝 Pop
    스택의 맨 위에 있는 데이터를 제거하고 반환한다.
  3. 탑 Top 또는 Peek
    스택의 맨 위에 있는 데이터를 확인하되, 제거하지 않는다.
  4. isEmpty
    스택이 비어 있는지를 확인한다.

스택의 특징

  • 삽입과 삭제가 한쪽 끝에서만 일어난다.
  • 후입선출 구조이기 때문에 순서가 반대가 된다.
  • 함수 호출, 되돌리기 기능, 괄호 검사, 수식 계산 등에 자주 사용된다.

배열을 이용한 스택 구현 예시

#include <iostream>
using namespace std;

#define MAX_SIZE 5  // 스택의 최대 크기

class Stack {
private:
    int data[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()) {
            cout << "스택이 가득 찼다" << endl;
            return;
        }
        data[++top] = value;
    }

    int pop() {
        if (isEmpty()) {
            cout << "스택이 비었다" << endl;
            return -1;
        }
        return data[top--];
    }

    int peek() {
        if (isEmpty()) {
            cout << "스택이 비었다" << endl;
            return -1;
        }
        return data[top];
    }
};

int main() {
    Stack s;
    s.push(10);
    s.push(20);
    s.push(30);

    cout << "맨 위의 값: " << s.peek() << endl;  // 30 출력

    cout << "팝: " << s.pop() << endl;  // 30 제거
    cout << "팝: " << s.pop() << endl;  // 20 제거

    cout << "현재 맨 위의 값: " << s.peek() << endl;  // 10 출력

    return 0;
}

정리

스택은 가장 최근의 데이터를 가장 먼저 처리해야 하는 상황에서 유용하다.
대표적인 예로 브라우저 뒤로가기, 실행 취소 기능, 함수 호출 스택 등이 있다.
하지만 스택의 크기를 초과해 데이터를 넣으면 스택 오버플로우,
비어 있는 스택에서 데이터를 꺼내려 하면 스택 언더플로우가 발생하므로 주의해야 한다.

 

반응형

'DEVELOPMENT > Algorithm' 카테고리의 다른 글

그래프(Graph)  (0) 2019.02.07
정렬(Sorting)의 비교  (0) 2019.02.07
큐(Queue)  (0) 2019.02.07
연결리스트(Linked List)  (0) 2019.02.07
자료구조 개요  (0) 2019.02.07