3、设计一个环形队列,用front和rear分别作为队头和队尾指针,另外用一个tag表示队列是空(0)还是不空(1),这样就可以用front==rear作为队满的条件。要求设计队列的相关基本运算算法。利用c++实现,并输出相关代码
时间: 2024-10-19 08:12:25 浏览: 33
利用tag定义一个环形队列
4星 · 用户满意度95%
环形队列的设计主要是为了处理队列的头部和尾部同时出队的情况,避免普通队列可能出现的队尾溢出问题。以下是使用C++实现的一个简单环形队列结构以及基本操作:
```cpp
#include <iostream>
class CircularQueue {
private:
int capacity; // 队列容量
int front; // 队头指针
int rear; // 队尾指针
bool tag; // 队列状态标志,0为空,1非空
public:
CircularQueue(int size) {
capacity = size;
front = rear = -1;
tag = false;
}
// 插入元素
void enqueue(int value) {
if ((rear + 1) % capacity == front) { // 如果已满
std::cout << "Queue is full.\n";
return;
}
rear = (rear + 1) % capacity; // 更新队尾指针
data[rear] = value;
tag = true;
std::cout << "Inserted: " << value << "\n";
}
// 删除元素并返回(模拟)
int dequeue() {
if (isEmpty()) { // 如果为空
std::cout << "Queue is empty.\n";
return -1; // 返回默认值或抛异常
}
int removedValue = data[front]; // 保存删除的元素
front = (front + 1) % capacity; // 更新队头指针
tag = front != rear; // 更新队列状态
return removedValue;
}
// 判断队列是否为空
bool isEmpty() const {
return front == rear && !tag;
}
// 打印队列内容
void display() const {
if (!isEmpty()) {
for (int i = front; i != rear; i = (i + 1) % capacity) {
std::cout << data[i] << " ";
}
std::cout << data[front] << std::endl;
} else {
std::cout << "Queue is empty.\n";
}
}
private:
int data[capacity]; // 环形存储空间
};
int main() {
CircularQueue queue(5);
queue.enqueue(1);
queue.enqueue(2);
queue.display(); // 输出:1 2
queue.dequeue();
queue.enqueue(3); // 由于队满,这行不会打印任何内容
queue.display(); // 输出:2 3
return 0;
}
```
在这个实现中,我们创建了一个`CircularQueue`类,包含enqueue(插入)、dequeue(删除)、isEmpty(检查空队列)、display(查看队列内容)等函数。注意,这里只是一个模拟,实际上不需要真正的数组,可以使用动态内存管理或其他数据结构实现。
阅读全文