[자료구조] Stack

cowmin·2025년 7월 27일

1. Stack이란?

후입선출(LIFO, Last In First Out) 방식으로 가장 나중에 들어온 데이터가 가장 먼저 나간다. 데이터를 삽입 삭제하는 연산이 한쪽에서만 진행된다.



Stack Visualizer



2. Stack 구현해보기

  • 숫자를 여러개 저장할 수 있는 배열 변수 생성
  • 배열에 직접 숫자를 저장하는 것을 막기 위해 접근 제어자로 제어
  • 몇 개의 숫자를 저장했는지 확인할 수 있는 top 변수

2.1 생성자

public class Stack<T> {
    private T[] stack;
    private int top;

    public Stack(int size) { // 정수를 전달받아 해당 크기의 배열 생성
        stack = (T[]) new Object[size]; // 제네릭 타입은 배열로 직접 생성 불가
        top = -1;
    }
}

2.2 isEmpty()

스택이 비어있는지 확인

public boolean isEmpty() {
        return top == -1;
}

2.3 isFull()

스택이 다 차있는지 확인

public boolean isFull() {
        return top == stack.length -1;
}

2.4 peek()

스택 맨 위 요소 반환

public T peek() {
        if(isEmpty()) {
            System.out.println("스택이 비어 있습니다.");
            return null;
        }
        return stack[top];
    }

2.5 push

스택 맨 위에 요소 추가

public void push(T data) {
		if(isFull()) {
            System.out.println("스택이 가득 찼습니다.");
            return;
        }
        top++;
        stack[top] = data;
}

2.6 pop()

스택 맨 위 요소 제거 및 반환

public T pop() {
		if(isEmpty()) {
            System.out.println("스택이 비어 있습니다.");
            return null;
        }
        T tmp = stack[top];
        stack[top] = null;
        top--;
        return tmp;
    }

2.7 display()

스택의 모든 요소 출력

public void display() {
        for (int i = 0; i <= top; i++) {
            System.out.print(stack[i] + " ");
        }
        System.out.println();
    }


3. Stack 사용해보기

Main

package stack;

public class Main {
    public static void main(String[] args) {
        // 스택 생성 (최대 5개 저장)
        Stack<String> myStack = new Stack<>(5);

        // push 테스트
        myStack.push("A");
        myStack.push("B");
        myStack.push("C");

        // display 테스트
        System.out.print("현재 스택: ");
        myStack.display(); // A B C

        // peek 테스트
        System.out.println("peek(): " + myStack.peek()); // C

        // pop 테스트
        System.out.println("pop(): " + myStack.pop());   // C 꺼냄
        System.out.print("스택 상태: ");
        myStack.display(); // A B

        // push & isFull 테스트
        myStack.push("D");
        myStack.push("E");
        myStack.push("F"); // 이제 가득 참
        myStack.push("G"); // 스택이 가득 찼습니다.

        System.out.print("최종 스택 상태: ");
        myStack.display();

        // 전부 pop 해보기
        while (!myStack.isEmpty()) {
            System.out.println("pop(): " + myStack.pop());
        }

        // 빈 스택 pop
        myStack.pop(); // 스택이 비어 있습니다.
    }
}



4. Stack 시간 복잡도

  • push: O(1)
  • pop: O(1)
  • peek: O(1)
  • isEmpty: O(1)

0개의 댓글