在佇列的基本型態中,當我們從前端刪除元素時,我們不會重新使用該空間。環狀佇列,或稱為循環佇列(Circular Queue),是一種允許我們重複使用空間的佇列。在環狀佇列中,當最後一位置用完後,下一個插入元素的位置將是佇列的開頭。
環狀佇列的概念
環狀佇列可以被視為一個循環的陣列,其中末尾和開頭是相連接的。當我們試圖在已滿的環狀佇列中進行入佇列操作時,我們將從開頭重新開始,只要開頭前面的位置是空的。
使用陣列實作環狀佇列
以下是環狀佇列的基本結構和操作:
#include <iostream>
#define SIZE 5 // 定義環狀佇列的大小
class CircularQueue {
private:
int front, rear;
int arr[SIZE];
public:
CircularQueue() : front(-1), rear(-1) {}
bool isFull() {
return (rear + 1) % SIZE == front;
}
bool isEmpty() {
return front == -1;
}
void enqueue(int data) {
if (isFull()) {
std::cout << "Queue is full!" << std::endl;
return;
}
if (isEmpty()) {
front = rear = 0;
} else {
rear = (rear + 1) % SIZE;
}
arr[rear] = data;
}
int dequeue() {
if (isEmpty()) {
std::cout << "Queue is empty!" << std::endl;
return -1;
}
int value = arr[front];
if (front == rear) {
front = rear = -1;
} else {
front = (front + 1) % SIZE;
}
return value;
}
int peek() {
if (isEmpty()) {
std::cout << "Queue is empty!" << std::endl;
return -1;
}
return arr[front];
}
};
int main() {
CircularQueue cq;
cq.enqueue(1);
cq.enqueue(2);
cq.enqueue(3);
cq.enqueue(4);
cq.enqueue(5);
std::cout << "Front of the queue: " << cq.peek() << std::endl; // 1
cq.dequeue();
cq.enqueue(6);
std::cout << "Front of the queue: " << cq.peek() << std::endl; // 2
return 0;
}
總結
環狀佇列提供了一種有效的方法來管理佇列,尤其是當有固定大小的陣列空間時。它允許我們在需要的時候重新使用已刪除的空間,這是常規佇列所不具備的特點。