[java] 자바에서 동적 스택 구현하기

스택은 데이터를 후입선출(LIFO) 구조로 저장하는 자료구조입니다. 일반적으로 정적 스택은 고정된 크기로 선언되고 사용됩니다. 하지만 때로는 스택의 크기가 동적으로 변해야 하는 상황이 있을 수 있습니다. 이러한 경우에는 동적 스택을 구현해야 합니다.

ArrayList를 이용한 동적 스택 구현하기

자바에서는 ArrayList를 이용하여 동적 스택을 구현할 수 있습니다. ArrayList는 가변 크기 배열로, 크기가 자동으로 확장되거나 축소될 수 있습니다.

import java.util.ArrayList;

public class DynamicStack {
    private ArrayList<Integer> stack;

    public DynamicStack() {
        stack = new ArrayList<>();
    }

    public void push(int data) {
        stack.add(data);
    }

    public int pop() {
        if (!isEmpty()) {
            return stack.remove(stack.size() - 1);
        } else {
            throw new IllegalStateException("스택이 비어있습니다.");
        }
    }

    public int peek() {
        if (!isEmpty()) {
            return stack.get(stack.size() - 1);
        } else {
            throw new IllegalStateException("스택이 비어있습니다.");
        }
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }

    public int size() {
        return stack.size();
    }
}

위의 코드는 ArrayList를 이용하여 동적 스택을 구현한 예시입니다. push 메소드는 스택에 데이터를 추가하고, pop 메소드는 스택에서 데이터를 제거하여 반환합니다. peek 메소드는 스택의 가장 위에 있는 데이터를 반환하지만 제거하지는 않습니다. isEmpty 메소드는 스택이 비어있는지 여부를 확인하고, size 메소드는 스택의 크기를 반환합니다.

이제 동적 스택을 사용해보겠습니다.

public class Main {
    public static void main(String[] args) {
        DynamicStack stack = new DynamicStack();

        stack.push(1);
        stack.push(2);
        stack.push(3);

        System.out.println(stack.pop());  // 3
        System.out.println(stack.pop());  // 2
        System.out.println(stack.peek()); // 1
        System.out.println(stack.size()); // 1
        System.out.println(stack.isEmpty()); // false
    }
}

위의 코드는 동적 스택을 사용하는 예시입니다. push 메소드로 데이터를 스택에 추가하고, pop 메소드로 데이터를 스택에서 제거하여 출력합니다. peek 메소드를 통해 가장 위에 있는 데이터를 확인할 수 있습니다. size 메소드를 통해 스택의 크기를 확인하고, isEmpty 메소드는 스택이 비어있는지 여부를 확인합니다.

결론

이번 포스트에서는 자바에서 동적 스택을 구현하는 방법을 알아보았습니다. ArrayList를 이용하여 간단하게 동적 스택을 구현할 수 있습니다. 동적 스택을 사용하면 스택의 크기를 동적으로 조절할 수 있고, 메모리를 효율적으로 사용할 수 있습니다.