큐(Queue)는 데이터를 일렬로 나열한 자료구조로, 데이터의 삽입은 한쪽 끝(rear 또는 tail)에서 이루어지고, 삭제는 반대쪽 끝(front 또는 head)에서 이루어지는 구조를 가지고 있습니다.
자바에서는 java.util.Queue 인터페이스를 제공한다.
대표적으로 LinkedList와 ArrayDeque가 있다.
public class LinearQueue {
private int maxSize;
private int[] queueArray;
private int front;
private int rear;
public LinearQueue(int size) {
maxSize = size + 1; // 한 칸은 비워두어야 하므로 크기를 1 증가시킴
queueArray = new int[maxSize];
front = rear = 0; // 초기에 front와 rear는 같은 위치에 있음
}
public void enqueue(int item) {
if (!isFull()) {
queueArray[rear] = item;
rear = (rear + 1) % maxSize;
System.out.println("Enqueued: " + item);
} else {
System.out.println("Queue is full. Cannot enqueue " + item);
}
}
public int dequeue() {
if (!isEmpty()) {
int dequeuedValue = queueArray[front];
front = (front + 1) % maxSize;
System.out.println("Dequeued: " + dequeuedValue);
return dequeuedValue;
} else {
System.out.println("Queue is empty. Cannot dequeue.");
return -1; // 큐가 비어있을 때는 임의의 값(-1) 반환
}
}
public boolean isEmpty() {
return front == rear;
}
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
public static void main(String[] args) {
// 선형 큐 생성 (최대 크기: 5)
LinearQueue queue = new LinearQueue(5);
// 큐에 요소 추가
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
// 큐의 현재 맨 앞 요소 확인
System.out.println("Front element: " + queue.queueArray[queue.front]);
// 큐에서 요소 제거
queue.dequeue();
queue.dequeue();
// 큐이 비어있는지 여부 확인
System.out.println("Is queue empty? " + queue.isEmpty());
// 큐에 요소 추가
queue.enqueue(4);
queue.enqueue(5);
queue.enqueue(6); // 큐가 가득 차서 추가되지 않음
}
}
public class CircularQueue {
private int maxSize;
private int[] queueArray;
private int front;
private int rear;
public CircularQueue(int size) {
maxSize = size + 1; // 한 칸은 비워두어야 하므로 크기를 1 증가시킴
queueArray = new int[maxSize];
front = rear = 0; // 초기에 front와 rear는 같은 위치에 있음
}
public void enqueue(int item) {
if (!isFull()) {
queueArray[rear] = item;
rear = (rear + 1) % maxSize;
System.out.println("Enqueued: " + item);
} else {
System.out.println("Queue is full. Cannot enqueue " + item);
}
}
public int dequeue() {
if (!isEmpty()) {
int dequeuedValue = queueArray[front];
front = (front + 1) % maxSize;
System.out.println("Dequeued: " + dequeuedValue);
return dequeuedValue;
} else {
System.out.println("Queue is empty. Cannot dequeue.");
return -1; // 큐가 비어있을 때는 임의의 값(-1) 반환
}
}
public boolean isEmpty() {
return front == rear;
}
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
public static void main(String[] args) {
// 원형 큐 생성 (최대 크기: 5)
CircularQueue queue = new CircularQueue(5);
// 큐에 요소 추가
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
// 큐의 현재 맨 앞 요소 확인
System.out.println("Front element: " + queue.queueArray[queue.front]);
// 큐에서 요소 제거
queue.dequeue();
queue.dequeue();
// 큐이 비어있는지 여부 확인
System.out.println("Is queue empty? " + queue.isEmpty());
// 큐에 요소 추가
queue.enqueue(4);
queue.enqueue(5);
queue.enqueue(6); // 큐가 가득 차서 추가되지 않음
}
}
class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
public class CircularQueueLinkedList {
private Node front;
private Node rear;
public CircularQueueLinkedList() {
this.front = null;
this.rear = null;
}
public void enqueue(int item) {
Node newNode = new Node(item);
if (isEmpty()) {
front = rear = newNode;
} else {
rear.next = newNode;
rear = newNode;
}
rear.next = front; // 연결 리스트를 원형으로 만듦
System.out.println("Enqueued: " + item);
}
public int dequeue() {
if (isEmpty()) {
System.out.println("Queue is empty. Cannot dequeue.");
return -1; // 큐가 비어있을 때는 임의의 값(-1) 반환
}
int dequeuedValue = front.data;
if (front == rear) {
front = rear = null; // 큐에 마지막 요소가 있었다면 큐를 비움
} else {
front = front.next;
rear.next = front; // 연결 리스트를 원형으로 유지
}
System.out.println("Dequeued: " + dequeuedValue);
return dequeuedValue;
}
public boolean isEmpty() {
return front == null && rear == null;
}
public static void main(String[] args) {
// 연결 리스트를 기반으로 한 원형 큐 생성
CircularQueueLinkedList queue = new CircularQueueLinkedList();
// 큐에 요소 추가
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
// 큐에서 요소 제거
queue.dequeue();
queue.dequeue();
// 큐이 비어있는지 여부 확인
System.out.println("Is queue empty? " + queue.isEmpty());
// 큐에 요소 추가
queue.enqueue(4);
queue.enqueue(5);
queue.enqueue(6);
}
}
여러 작업이 동시에 발생할 때, 작업이 큐에 삽입되고 가장 먼저 들어온 작업니 가장 먼저 처리됩니다.
그래프에서 너비 우선 탐색을 수행할 때 큐를 사용하여 레벨 단위로 탐색합니다.
여러 문서가 프린터에 출력되기를 기다리는 경우, 가장 먼저 들어온 문서가 가장 먼저 출력됩니다.