YunDev

[자료구조] 스택 본문

자료구조와 알고리즘

[자료구조] 스택

S준 2025. 2. 26. 00:23

스택(Stack)Last In, First Out (LIFO, 후입선출) 구조를 가지는 자료구조입니다.
즉, 가장 마지막에 추가된 데이터가 가장 먼저 제거되는 방식입니다.

1. 스택의 개념

  • 데이터를 쌓아 올리는 구조로 동작하며, 한쪽 끝에서만 데이터 삽입과 삭제가 이루어짐.
  • 후입선출(LIFO, Last In First Out) 구조.
  • 주로 함수 호출 스택, 되돌리기(Undo) 기능, 괄호 검사, 경로 탐색(DFS) 등에 사용됨.

 

  • 배열을 이용한 스택 구현
class Stack {
    private int top; // 스택의 최상위 인덱스
    private int maxSize; // 스택의 크기
    private int[] stackArray; // 배열을 이용한 스택

    // 생성자
    public Stack(int size) {
        this.maxSize = size;
        this.stackArray = new int[maxSize];
        this.top = -1; // 초기값 설정 (스택이 비어있는 상태)
    }

    // push: 스택에 요소 추가
    public void push(int item) {
        if (top == maxSize - 1) { // 스택이 가득 찬 경우
            System.out.println("스택이 가득 찼습니다!");
            return;
        }
        stackArray[++top] = item;
    }

    // pop: 스택에서 요소 제거 및 반환
    public int pop() {
        if (isEmpty()) {
            System.out.println("스택이 비어 있습니다!");
            return -1; // 에러 값 반환
        }
        return stackArray[top--];
    }

    // peek: 스택의 최상위 요소 확인 (제거 X)
    public int peek() {
        if (isEmpty()) {
            System.out.println("스택이 비어 있습니다!");
            return -1;
        }
        return stackArray[top];
    }

    // isEmpty: 스택이 비어있는지 확인
    public boolean isEmpty() {
        return (top == -1);
    }

    // size: 현재 스택에 있는 요소 개수 반환
    public int size() {
        return top + 1;
    }
}

// 실행 테스트
public class StackExample {
    public static void main(String[] args) {
        Stack stack = new Stack(5);

        stack.push(10);
        stack.push(20);
        stack.push(30);

        System.out.println("현재 top 요소: " + stack.peek()); // 30
        System.out.println("스택에서 pop: " + stack.pop()); // 30
        System.out.println("현재 top 요소: " + stack.peek()); // 20
        System.out.println("스택 크기: " + stack.size()); // 2
    }
}

또한 Java에서는 Stack 클래스를 직접 제공하여 쉽게 사용할 수 있습니다.

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        // 데이터 추가 (push)
        stack.push(10);
        stack.push(20);
        stack.push(30);

        // 데이터 확인 (peek)
        System.out.println("현재 top 요소: " + stack.peek()); // 30

        // 데이터 제거 (pop)
        System.out.println("스택에서 pop: " + stack.pop()); // 30
        System.out.println("현재 top 요소: " + stack.peek()); // 20

        // 스택이 비어 있는지 확인
        System.out.println("스택이 비어 있는가? " + stack.isEmpty()); // false
    }
}

 

  • 스택(Stack)후입선출(LIFO) 방식으로 동작하는 자료구조.
  • push(), pop(), peek() 등의 연산을 통해 데이터 추가 및 제거 가능.
  • 함수 호출 스택, 괄호 검사, 경로 탐색(DFS) 등에 활용됨.
  • Java에서는 Stack 클래스를 제공하여 간편하게 사용 가능.