개인공부/자료구조

[자료구조] 스택

개바리여리 2025. 5. 28. 23:16

 

스택 (Stack)

 

스택은 후입선출(Last In First Out, LIFO) 구조를 가진 자료구조

먼저 들어온 데이터가 아래로 쌓여서 마지막에 들어온 데이터가 먼저 나가는 구조이다.

 

주요 연산

  • push(item) : 스택에 데이터를 삽입  /  O(1)의 시간복잡도를 가진다.
  • pop() : 스택에서 데이터를 제거하고 반환  /  O(1)의 시간복잡도를 가진다.
  • peek() : 스택의 맨 위 데이터를 반환(제거하지 않음)  /  O(1)의 시간복잡도를 가진다.
  • isEmpty() : 스택이 비어 있는지 확인

* 접근 및 탐색에는 O(n) 의 시간복잡도를 가진다.

 

스택의 활용 예시

  • 웹 브라우저의 뒤로가기 기능 (방문 기록 스택)
  • 함수 호출 스택 (프로그램 실행 중 재귀 호출 관리)
  • 수식 계산기 (후위 표기법 계산)
  • 괄호 검사 문제 (열림/닫힘 괄호 짝 맞추기)

 

자바를 통한 간단한 스택 구현 예시

 

- 배열기반

class ArrayStack {
    int[] arr = new int[5];
    int top = -1;

    void push(int x) { arr[++top] = x; }
    int pop() { return arr[top--]; }
    int peek() { return arr[top]; }
    boolean isEmpty() { return top == -1; }
}

public class Main {
    public static void main(String[] args) {
        ArrayStack s = new ArrayStack();
        s.push(1); s.push(2); s.push(3);
        System.out.println(s.pop());   // 3
        System.out.println(s.peek());  // 2
    }
}

 

 

- 연결 리스트 기반

 

class Node {
    int data;
    Node next;
    Node(int d) { data = d; }
}

class LinkedStack {
    Node top = null;

    void push(int x) {
        Node n = new Node(x);
        n.next = top;
        top = n;
    }
    int pop() { int v = top.data; top = top.next; return v; }
    int peek() { return top.data; }
    boolean isEmpty() { return top == null; }
}

public class Main2 {
    public static void main(String[] args) {
        LinkedStack s = new LinkedStack();
        s.push(1); s.push(2); s.push(3);
        System.out.println(s.pop());   // 3
        System.out.println(s.peek());  // 2
    }
}