循环队列(Circular Queue)是一种使用固定大小的数组实现的队列,它将队尾的下一个位置指向数组的头部,形成一个循环。这种队列也称为环形队列。循环队列的主要优势是高效利用空间,避免在队列达到末尾时从头开始的数组复制操作。 循环队列的特点:- 固定大小:循环队列预先分配固定数量的元素空间。
- 循环利用空间:当队尾到达数组末尾时,下一个位置会回绕到数组的开始处。
- 避免数组复制:不需要在队列移动到数组头部时复制整个数组。
循环队列的实现:循环队列通常使用两个指针(或索引)来跟踪队首和队尾的位置: front :指向队首元素的索引。rear :指向队尾元素的下一个位置的索引。
基本操作:- Enqueue(入队):将新元素放入
rear 所指向的位置,并更新rear 。 - Dequeue(出队):移除
front 所指向的元素,并更新front 。 - Peek(查看):返回队首元素但不移除它。
- IsEmpty(判断空):检查队列是否为空,即
front 是否等于rear 。 - IsFull(判断满):检查队列是否已满,可以通过比较
rear 和front 的下一个位置是否相遇来判断。
代码示例:#include <iostream>
#include <vector>
class CircularQueue {
private:
std::vector<int> queue;
int front;
int rear;
bool isFull;
public:
CircularQueue(int size) : queue(size), front(0), rear(-1), isFull(false) {}
void enqueue(int value) {
if (isFull) {
throw std::overflow_error("Queue is full");
}
rear = (rear + 1) % queue.size();
queue[rear] = value;
isFull = (front == rear);
}
int dequeue() {
if (isEmpty()) {
throw std::underflow_error("Queue is empty");
}
int value = queue[front];
front = (front + 1) % queue.size();
isFull = false;
return value;
}
int peek() {
if (isEmpty()) {
throw std::underflow_error("Queue is empty");
}
return queue[front];
}
bool isEmpty() {
return !isFull && (front == rear);
}
bool isFull() {
return isFull;
}
int size() {
if (isFull) {
return queue.size();
}
return (rear - front + queue.size()) % queue.size();
}
};
循环队列的应用场景:- 内存管理:在某些操作系统中,循环队列可以用于管理内存块。
- 数据缓冲:在数据流处理中,循环队列可以作为缓冲区,存储临时数据。
- 模拟物理队列:在模拟现实世界中的队列时,循环队列可以避免数组复制,提高效率。
注意事项:- 循环队列在
front 和rear 相遇时可能难以区分空队列和满队列。一种常见的解决方法是使用一个标记或额外的状态来区分这两种情况。 - 循环队列的实现需要仔细处理索引的回绕和边界条件。
循环队列是一种高效的数据结构,特别适用于固定大小的队列操作,通过循环利用数组空间,减少了内存的浪费,并提高了性能。
(责任编辑:admin) |