개발/JAVA

Java 자료구조: 스택(Stack)과 큐(Queue) 배우기!

예니03 2025. 1. 9. 11:31
반응형

여러분, 접시를 쌓아 올리는 걸 상상해본 적 있나요? 또는 줄을 서서 차례대로 물건을 받는 모습을 떠올려본 적 있나요? Java에는 이렇게 데이터를 저장하고 꺼내는 순서를 관리할 수 있는 자료구조가 있습니다. 바로 스택(Stack)큐(Queue)입니다. 오늘은 이 두 가지를 간단한 예제와 함께 배워보아요! 😊

1. 스택(Stack) - 접시를 쌓고 꺼내는 구조

스택은 접시를 쌓는 것과 같은 구조입니다.

  • 데이터 입력: 접시를 쌓듯 데이터를 쌓습니다.
  • 데이터 출력: 가장 위에 있는 데이터를 먼저 꺼냅니다.
  • LIFO(Last In, First Out): 마지막에 들어간 데이터가 가장 먼저 나옵니다.

1-1. 스택 사용법: 예제

import java.util.Stack;

public class StackEx {
    public static void main(String[] args) {
        // 스택 선언
        Stack<Integer> stack = new Stack<>();

        // 1. 데이터 입력 (push)
        for (int i = 0; i < 5; i++) {
            stack.push(i);  // 데이터를 스택에 넣음
            System.out.println("Stack: " + stack);
        }

        // 2. 가장 위에 있는 데이터 확인 (peek)
        System.out.println("Peek: " + stack.peek());  // 출력: 4
        System.out.println("Stack: " + stack);

        // 3. 데이터 꺼내기 (pop)
        System.out.println("Pop: " + stack.pop());  // 출력: 4
        System.out.println("Stack: " + stack);

        // 4. 스택이 비어있을 때까지 데이터 꺼내기
        while (!stack.empty()) {  // 스택이 비어있지 않으면 반복
            System.out.println("Pop: " + stack.pop());
            System.out.println("Stack: " + stack);
        }
    }
}

실행 결과

Stack: [0]  
Stack: [0, 1]  
Stack: [0, 1, 2]  
Stack: [0, 1, 2, 3]  
Stack: [0, 1, 2, 3, 4]  
Peek: 4  
Stack: [0, 1, 2, 3, 4]  
Pop: 4  
Stack: [0, 1, 2, 3]  
Pop: 3  
Stack: [0, 1, 2]  
Pop: 2  
Stack: [0, 1]  
Pop: 1  
Stack: [0]  
Pop: 0  
Stack: []

 

1-2. 스택 동작 원리

  1. Push: 데이터를 쌓습니다.
    • 예: stack.push(1) → 스택에 1을 추가.
  2. Peek: 가장 위에 있는 데이터를 확인합니다.
    • 예: stack.peek() → 마지막 데이터(4)를 확인.
  3. Pop: 가장 위에 있는 데이터를 꺼내며 삭제합니다.
    • 예: stack.pop() → 4를 꺼내고 스택에서 삭제.
  4. Empty 확인: stack.empty()로 스택이 비어있는지 확인.

 

2. 큐(Queue) - 줄을 서는 구조

큐는 줄을 서서 물건을 받는 것과 같은 구조입니다.

  • 데이터 입력: 줄 맨 뒤에 데이터를 추가합니다.
  • 데이터 출력: 줄 맨 앞의 데이터를 꺼냅니다.
  • FIFO(First In, First Out): 먼저 들어간 데이터가 먼저 나옵니다.

2-1. 큐 사용법: 예제

import java.util.LinkedList;
import java.util.Queue;

public class QueueEx {
    public static void main(String[] args) {
        // 큐 선언
        Queue<Integer> queue = new LinkedList<>();

        // 1. 데이터 입력 (offer)
        for (int i = 0; i < 5; i++) {
            queue.offer(i);  // 데이터를 큐에 넣음
            System.out.println("Queue: " + queue);
        }

        // 2. 가장 앞에 있는 데이터 확인 (peek)
        System.out.println("Peek: " + queue.peek());  // 출력: 0

        // 3. 데이터 꺼내기 (poll)
        System.out.println("Poll: " + queue.poll());  // 출력: 0
        System.out.println("Queue: " + queue);

        // 4. 큐가 비어있을 때까지 데이터 꺼내기
        while (!queue.isEmpty()) {  // 큐가 비어있지 않으면 반복
            System.out.println("Poll: " + queue.poll());
            System.out.println("Queue: " + queue);
        }
    }
}

실행 결과

Queue: [0]  
Queue: [0, 1]  
Queue: [0, 1, 2]  
Queue: [0, 1, 2, 3]  
Queue: [0, 1, 2, 3, 4]  
Peek: 0  
Poll: 0  
Queue: [1, 2, 3, 4]  
Poll: 1  
Queue: [2, 3, 4]  
Poll: 2  
Queue: [3, 4]  
Poll: 3  
Queue: [4]  
Poll: 4  
Queue: []

 

2-2. 큐 동작 원리

  1. Offer: 데이터를 줄 맨 뒤에 추가합니다.
    • 예: queue.offer(1) → 큐에 1 추가.
  2. Peek: 줄 맨 앞에 있는 데이터를 확인합니다.
    • 예: queue.peek() → 0 확인.
  3. Poll: 줄 맨 앞에 있는 데이터를 꺼내며 삭제합니다.
    • 예: queue.poll() → 0 꺼내고 큐에서 삭제.
  4. Empty 확인: queue.isEmpty()로 큐가 비어있는지 확인.

 

3. 스택 vs. 큐: 차이점

특징 스택(Stack) 큐(Queue)
동작 원리 LIFO (Last In, First Out) FIFO (First In, First Out)
데이터 입력 push (맨 위에 추가) offer (맨 뒤에 추가)
데이터 출력 pop (맨 위에서 제거) poll (맨 앞에서 제거)
데이터 확인 peek (맨 위 확인) peek (맨 앞 확인)

4. 정리

  • 스택(Stack): 접시를 쌓듯 데이터를 관리하며, 마지막 데이터가 먼저 나옵니다.
  • 큐(Queue): 줄을 서듯 데이터를 관리하며, 첫 번째 데이터가 먼저 나옵니다.
  • 공통점: 둘 다 데이터를 저장하고 꺼내는 구조를 효율적으로 관리합니다.
반응형