循环队列运行效果图,要能体现入队,出队时队头、队尾的变化,和成环的效果用C++语言编写,用结构体定义base front rear
时间: 2024-10-27 14:10:51 浏览: 34
循环队列是一种特殊的线性表,用于在队列的两端添加和删除元素,当队列满时,新的元素会在头部覆盖掉最早进队的元素,形成一个“环”。下面是一个简单的C++实现,包括了基本的操作(如入队、出队)以及队头、队尾的变化:
```cpp
#include <iostream>
struct Node {
int data;
Node* next;
};
class CircularQueue {
private:
Node* front; // 队头指针
Node* rear; // 队尾指针
int capacity; // 队列容量
public:
CircularQueue(int size) : front(nullptr), rear(nullptr), capacity(size) {}
bool isFull() const {
return (rear + 1) % capacity == front; // 如果加一超过容量边界,则表示满
}
bool isEmpty() const {
return front == rear;
}
void enqueue(int value) {
if (isFull()) {
std::cout << "Queue is full.\n";
return;
}
Node* newNode = new Node();
newNode->data = value;
newNode->next = front;
if (isEmpty()) {
rear = front;
} else {
rear->next = front; // 更新环形结构
}
front = (front + 1) % capacity; // 移动前端
rear = (rear + 1) % capacity;
}
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; // 更新队头
if (front == rear) { // 队列恢复到非环形状态
rear = nullptr;
}
}
delete temp; // 释放内存
return removedValue;
}
// 显示队列内容(仅作演示,实际应用可能需要其他形式的遍历)
void display() {
if (isEmpty()) {
std::cout << "Queue is empty.\n";
} else {
Node* current = front;
while (current != rear) {
std::cout << current->data << " -> ";
current = current->next;
}
std::cout << current->data << " [end of queue]\n";
}
}
};
int main() {
CircularQueue cq(5); // 初始化一个容量为5的队列
cq.enqueue(1);
cq.enqueue(2);
cq.enqueue(3);
cq.enqueue(4);
cq.display(); // 队列显示:1 -> 2 -> 3 -> 4 -> 1 [end of queue]
cq.dequeue();
cq.dequeue();
cq.display(); // 队列显示:3 -> 4 -> 1 [end of queue]
return 0;
}
```
在这个例子中,`enqueue()` 和 `dequeue()` 函数分别实现了入队和出队操作,并展示了队头和队尾在插入和移除元素时的变化。当队列成环时(即只有一个元素),`dequeue()` 将恢复非环形状态。
阅读全文