Java

[Java] Stack 구현 예제

teamnova 2025. 3. 31. 14:53
728x90

1. Stack 구현
 1.1. Stack의 개념
Stack은 후입선출(LIFO, Last In First Out) 방식의 자료구조로, 마지막에 삽입된 요소가 가장 먼저 삭제됩니다. 일상적인 예로는 책 더미를 생각할 수 있습니다. 책을 하나씩 쌓을 때, 맨 위에 쌓은 책을 먼저 꺼내게 되죠.

 1.2. 구현 방법
배열을 사용하여 Stack을 구현할 수 있습니다. 배열을 사용하면 고정 크기의 Stack을 만들 수 있으며, Stack의 삽입(push), 삭제(pop), 확인(peek) 연산을 구현할 수 있습니다.

 1.3. Stack의 기능
push(value): Stack에 값을 추가.
pop(): Stack에서 값을 제거하고 반환.
peek(): Stack의 맨 위 값을 확인(삭제하지 않음).
isEmpty(): Stack이 비었는지 확인.
isFull(): Stack이 꽉 찼는지 확인.

 

1.4. Stack의 장점과 단점
장점:
구현이 간단하고, 후입선출(LIFO) 방식의 특성 덕분에 재귀 호출이나 함수 호출 스택과 같은 시스템에서 널리 사용됨.
예를 들어 브라우저의 뒤로 가기나 수식 계산기에서 유용.

단점:
고정 크기 배열로 구현하면 크기 제한이 있으며, 배열의 크기를 초과할 수 없다.
메모리 관리 측면에서 효율성이 떨어질 수 있음.

1.5. Stack 예시

// Stack 클래스 구현 (배열 기반)
class Stack {
    private int maxSize;
    private int top;
    private int[] stackArray;

    // Stack 생성자
    public Stack(int size) {
        maxSize = size;
        stackArray = new int[size];
        top = -1;  // Stack이 비어있으면 top은 -1
    }

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

    // Stack이 꽉 찼는지 확인
    public boolean isFull() {
        return top == maxSize - 1;
    }

    // Stack에 데이터 푸시
    public void push(int value) {
        if (isFull()) {
            System.out.println("Stack is full. Cannot push " + value);
        } else {
            stackArray[++top] = value;  // top을 증가시킨 후 값을 삽입
            System.out.println(value + " pushed to stack");
        }
    }

    // Stack에서 데이터 팝
    public int pop() {
        if (isEmpty()) {
            System.out.println("Stack is empty. Cannot pop");
            return -1;
        } else {
            return stackArray[top--];  // top 값을 반환하고 top을 감소시킴
        }
    }

    // Stack의 맨 위 값을 확인
    public int peek() {
        if (isEmpty()) {
            System.out.println("Stack is empty. Cannot peek");
            return -1;
        } else {
            return stackArray[top];  // 가장 최근에 푸시된 값 반환
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Stack stack = new Stack(5);  // Stack 크기 5로 생성

        stack.push(10);  // 10 푸시
        stack.push(20);  // 20 푸시
        stack.push(30);  // 30 푸시
        stack.push(40);  // 40 푸시

        System.out.println("Top element is: " + stack.peek());  // Stack의 top 확인

        System.out.println(stack.pop() + " popped from stack");  // 40 팝
        System.out.println(stack.pop() + " popped from stack");  // 30 팝

        System.out.println("Top element is: " + stack.peek());  // Stack의 top 확인
    }
}

 

시연 결과