
먼저 들어온 데이터가 먼저 나가는 FIFO(First-In - First-Out) 원칙을 따름
일상생활에서 줄을 서는 것과 유사한 개념
Enqueue: 큐에 요소를 추가
Dequeue: 큐에 요소를 제거
Front & Rear : 맨 앞 요소 Front 맨 뒤 요소 rear
제한한 크기 : 배열을 기반으로 한 정적 큐와 연결리스트를 기반으로 한 동적 큐로 나뉨
// Node 클래스: 링크드 리스트의 각 노드를 나타냅니다.
class Node {
int data; // 노드가 저장하는 데이터
Node next; // 다음 노드를 가리키는 포인터
// Node 객체를 생성할 때 데이터를 받아 초기화합니다.
public Node(int data) {
this.data = data;
this.next = null; // 다음 노드는 초기에는 없으므로 null로 설정합니다.
}
}
// Queue 클래스: 큐를 구현합니다.
class Queue {
private Node front; // 큐의 맨 앞 요소를 가리키는 포인터
private Node rear; // 큐의 맨 뒤 요소를 가리키는 포인터
// 큐를 초기화합니다.
public Queue() {
this.front = null; // 초기에는 노드가 없으므로 null로 설정합니다.
this.rear = null; // 초기에는 노드가 없으므로 null로 설정합니다.
}
// 큐가 비어있는지 확인합니다.
public boolean isEmpty() {
return front == null; // front가 null이면 큐는 비어있습니다.
}
// 큐에 요소를 추가합니다.
public void enqueue(int data) {
Node newNode = new Node(data); // 새로운 노드를 생성합니다.
if (isEmpty()) {
// 큐가 비어있다면 새로운 노드가 맨 앞이자 맨 뒤입니다.
front = rear = newNode;
} else {
// 큐가 비어있지 않다면 새로운 노드를 큐의 뒤쪽에 추가합니다.
rear.next = newNode; // 현재 rear가 가리키는 노드의 다음을 새 노드로 설정합니다.
rear = newNode; // rear를 새로운 노드로 업데이트합니다.
}
}
// 큐에서 요소를 제거하고 반환합니다.
public int dequeue() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty"); // 큐가 비어있으면 예외를 던집니다.
}
int data = front.data; // front가 가리키는 노드의 데이터를 저장합니다.
front = front.next; // front를 다음 노드로 업데이트합니다.
if (front == null) {
rear = null; // 만약 큐가 비어있다면 rear도 null로 업데이트합니다.
}
return data; // 제거된 요소의 데이터를 반환합니다.
}
// 큐의 맨 앞 요소를 반환합니다.
public int peek() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty"); // 큐가 비어있으면 예외를 던집니다.
}
return front.data; // front가 가리키는 노드의 데이터를 반환합니다.
}
}
고정된 크기의 배열로 구현