Back_End/JAVA

자바(JAVA) 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