能否提供一个用c++链表实现的循环队列的完整代码示例。
时间: 2024-10-23 22:05:10 浏览: 40
C++实现循环队列和链式队列的示例
当然可以。以下是一个简单的C++链表实现的循环队列(Circular Queue)的完整代码示例:
```cpp
#include <iostream>
// 定义节点结构体
struct Node {
int data;
Node* next;
};
class CircularQueue {
private:
Node* front; // 队头指针
Node* rear; // 队尾指针
int size; // 队列容量
int count; // 当前元素数量
public:
// 构造函数,初始化空队列
CircularQueue(int capacity) : front(nullptr), rear(nullptr), size(capacity), count(0) {}
// 判断队列是否为空
bool isEmpty() const {
return front == nullptr;
}
// 判断队列是否已满
bool isFull() const {
return (rear + 1) % size == front; // 使用模运算模拟循环
}
// 入队操作
void enqueue(int value) {
if (isFull()) {
std::cout << "Queue is full.\n";
return;
}
Node* newNode = new Node();
newNode->data = value;
newNode->next = front;
if (front == rear) { // 如果队列只有一个元素,则前后都指向它
rear = front;
} else {
rear->next = front;
}
front = newNode;
count++;
}
// 出队操作
int dequeue() {
if (isEmpty()) {
std::cout << "Queue is empty.\n";
return -1; // 返回一个特殊值表示出队失败
}
int removedValue = front->data;
Node* temp = front;
if (front == rear) { // 队列只剩下一个元素
front = rear = nullptr;
} else {
front = front->next;
}
delete temp;
count--;
return removedValue;
}
// 查看队首元素但不移除
int peek() const {
if (isEmpty()) {
std::cout << "Queue is empty.\n";
return -1;
}
return front->data;
}
// 返回当前队列大小
int getSize() const {
return count;
}
};
int main() {
CircularQueue cq(5); // 创建一个容量为5的循环队列
cq.enqueue(1);
cq.enqueue(2);
cq.enqueue(3);
std::cout << "Front element: " << cq.peek() << "\n"; // 输出队首元素
std::cout << "Size of queue: " << cq.getSize() << "\n";
cq.dequeue(); // 删除第一个元素
std::cout << "After dequeue: Front element is " << cq.peek() << "\n";
return 0;
}
```
这个例子展示了如何使用链表实现循环队列的基本操作,包括入队、出队、查看队首元素以及获取队列大小。请注意,在实际应用中,你需要处理内存分配和释放的问题,这里为了简洁起见略去了错误检查和异常处理。
阅读全文