IT 개발 라이프/Back_End

자바에서의 Stack, Queue, Deque ✨

10Biliion 2024. 12. 18. 17:15

1. Stack 🌐

스택(Stack)은 LIFO (Last In, First Out) 구조로, 마지막에 추가된 데이터가 가장 먼저 제거됩니다. 흔히 접시 쌓기에 비유할 수 있습니다.

주요 메서드

  • push(E item): 스택의 맨 위에 데이터를 추가합니다.
  • pop(): 스택의 맨 위에 있는 데이터를 제거하고 반환합니다.
  • peek(): 스택의 맨 위 데이터를 제거하지 않고 반환합니다.
  • isEmpty(): 스택이 비어 있는지 확인합니다.

예제 코드

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        
        // 데이터 추가
        stack.push(1);
        stack.push(2);
        stack.push(3);

        // 데이터 확인
        System.out.println("Top Element: " + stack.peek()); // 3

        // 데이터 제거
        System.out.println("Popped: " + stack.pop()); // 3

        // 스택 상태 확인
        System.out.println("Is Stack Empty? " + stack.isEmpty()); // false
    }
}

2. Queue 🚗

큐(Queue)는 FIFO (First In, First Out) 구조로, 먼저 추가된 데이터가 가장 먼저 제거됩니다. 흔히 줄서기 상황을 떠올릴 수 있습니다.

주요 인터페이스: Queue

  • add(E e): 큐의 맨 뒤에 데이터를 추가합니다. (예외 발생 가능)
  • offer(E e): 큐의 맨 뒤에 데이터를 추가합니다. (성공 여부 반환)
  • poll(): 큐의 맨 앞 데이터를 제거하고 반환합니다. (비어있을 경우 null 반환)
  • peek(): 큐의 맨 앞 데이터를 제거하지 않고 반환합니다.

예제 코드

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

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // 데이터 추가
        queue.offer("A");
        queue.offer("B");
        queue.offer("C");

        // 데이터 확인
        System.out.println("Front Element: " + queue.peek()); // A

        // 데이터 제거
        System.out.println("Removed: " + queue.poll()); // A

        // 큐 상태 확인
        System.out.println("Queue Size: " + queue.size()); // 2
    }
}

3. Deque 🔄

Deque(Double-Ended Queue)는 양쪽 끝에서 데이터를 추가하거나 제거할 수 있는 자료구조입니다. 스택과 큐의 동작을 모두 수행할 수 있습니다.

주요 인터페이스: Deque

  • addFirst(E e) / offerFirst(E e): 덱의 맨 앞에 데이터를 추가합니다.
  • addLast(E e) / offerLast(E e): 덱의 맨 뒤에 데이터를 추가합니다.
  • pollFirst() / removeFirst(): 덱의 맨 앞 데이터를 제거하고 반환합니다.
  • pollLast() / removeLast(): 덱의 맨 뒤 데이터를 제거하고 반환합니다.
  • peekFirst() / peekLast(): 덱의 맨 앞/뒤 데이터를 제거하지 않고 반환합니다.

예제 코드

import java.util.ArrayDeque;
import java.util.Deque;

public class DequeExample {
    public static void main(String[] args) {
        Deque<Integer> deque = new ArrayDeque<>();

        // 데이터 추가
        deque.offerFirst(1); // 앞에 추가
        deque.offerLast(2);  // 뒤에 추가
        deque.offerFirst(0); // 앞에 추가

        // 데이터 확인
        System.out.println("Front Element: " + deque.peekFirst()); // 0
        System.out.println("Rear Element: " + deque.peekLast());  // 2

        // 데이터 제거
        System.out.println("Removed from Front: " + deque.pollFirst()); // 0
        System.out.println("Removed from Rear: " + deque.pollLast());  // 2

        // 덱 상태 확인
        System.out.println("Deque Size: " + deque.size()); // 1
    }
}

차이점 한눈에 보기 🌍

자료구조 특징 주요 메서드
Stack LIFO (마지막에 추가된 데이터가 먼저 제거됨) push, pop, peek
Queue FIFO (먼저 추가된 데이터가 먼저 제거됨) offer, poll, peek
Deque 양쪽 끝에서 데이터 추가/제거 가능 offerFirst, pollLast, peekFirst