큐는 선입선출(FIFO, First In First Out) 방식을 따르는 선형 자료구조입니다. 즉, 먼저 삽입된 데이터가 가장 먼저 제거됩니다. 일상생활에서의 줄 서기와 유사한 개념이다.
큐의 주요 특징
- 입력과 출력의 위치가 다름:
- 데이터를 맨 뒤(Rear)에서 삽입.
- 데이터를 맨 앞(Front)에서 제거.
- FIFO(First In First Out):
- 먼저 들어온 데이터가 먼저 나감.
- 추상 자료형(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); // 큐가 가득 찼으므로 예외 발생
}
}