큐 (Queue)

는 선입선출(FIFO, First In First Out) 방식을 따르는 선형 자료구조입니다. 즉, 먼저 삽입된 데이터가 가장 먼저 제거됩니다. 일상생활에서의 줄 서기와 유사한 개념이다.

큐의 주요 특징

  1. 입력과 출력의 위치가 다름:
    • 데이터를 맨 뒤(Rear)에서 삽입.
    • 데이터를 맨 앞(Front)에서 제거.
  2. FIFO(First In First Out):
    • 먼저 들어온 데이터가 먼저 나감.
  3. 추상 자료형(ADT):
    • 기본 연산:
    • Enqueue: 데이터를 큐의 끝(Rear)에 삽입.
    • Dequeue: 큐의 앞(Front)에서 데이터를 제거.
    • Peek: 큐의 맨 앞(Front)에 있는 데이터를 확인.
    • isEmpty: 큐가 비었는지 확인.
public class ArrayQueue {
    private int[] queue; // 큐를 저장할 배열
    private int front;   // 큐의 시작
    private int rear;    // 큐의 끝
    private int size;    // 큐의 크기

    // 생성자: 큐의 최대 크기를 설정
    public ArrayQueue(int capacity) {
        queue = new int[capacity];
        front = 0;
        rear = 0;
        size = 0;
    }

    // 큐에 데이터 삽입 (Enqueue)
    public void enqueue(int data) {
        if (size == queue.length) {
            throw new IllegalStateException("Queue is full!");
        }
        queue[rear] = data;
        rear = (rear + 1) % queue.length; // 원형 큐 구현
        size++;
    }

    // 큐에서 데이터 제거 (Dequeue)
    public int dequeue() {
        if (isEmpty()) {
            throw new IllegalStateException("Queue is empty!");
        }
        int data = queue[front];
        front = (front + 1) % queue.length; // 원형 큐 구현
        size--;
        return data;
    }

    // 큐의 맨 앞 데이터 확인 (Peek)
    public int peek() {
        if (isEmpty()) {
            throw new IllegalStateException("Queue is empty!");
        }
        return queue[front];
    }

    // 큐가 비었는지 확인
    public boolean isEmpty() {
        return size == 0;
    }

    // 큐의 현재 크기 확인
    public int getSize() {
        return size;
    }

    // 큐의 모든 데이터 출력 (디버깅용)
    public void printQueue() {
        System.out.print("Queue: ");
        for (int i = 0; i < size; i++) {
            System.out.print(queue[(front + i) % queue.length] + " ");
        }
        System.out.println();
    }

    // 테스트
    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(5); // 크기 5인 큐 생성

        queue.enqueue(10);
        queue.enqueue(20);
        queue.enqueue(30);
        queue.printQueue(); // 출력: Queue: 10 20 30

        System.out.println("Dequeued: " + queue.dequeue()); // 출력: Dequeued: 10
        queue.printQueue(); // 출력: Queue: 20 30

        queue.enqueue(40);
        queue.enqueue(50);
        queue.printQueue(); // 출력: Queue: 20 30 40 50

        System.out.println("Peek: " + queue.peek()); // 출력: Peek: 20

        queue.enqueue(60);
        queue.printQueue(); // 출력: Queue: 20 30 40 50 60

        // Uncommenting the following line will throw an exception
        // queue.enqueue(70); // 큐가 가득 찼으므로 예외 발생
    }
}