본문 바로가기
Java

[Java] Stack 구현 예제

by teamnova 2025. 3. 31.
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 확인
    }
}

 

시연 결과