3、设计一个环形队列,用front和rear分别作为队头和队尾指针,另外用一个tag表示队列是空(0)还是不空(1),这样就可以用front==rear作为队满的条件。要求设计队列的相关基本运算算法。利用c++实现,在主函数中测试实现并输出相关代码
时间: 2024-10-19 18:12:24 浏览: 22
设计一个环形队列(Circular Queue)可以采用数组作为底层数据结构,并通过front和rear指针以及一个bool类型的tag来跟踪队列的状态。以下是主要操作的伪代码描述:
```cpp
// 环形队列模板定义
template <typename T>
class CircularQueue {
private:
int capacity;
int front, rear;
bool tag;
public:
// 构造函数
CircularQueue(int size) : capacity(size), front(0), rear(0), tag(false) {}
// 判断队列是否为空
bool isEmpty() const { return front == rear && !tag; }
// 判断队列是否已满
bool isFull() const { return (rear + 1) % capacity == front && tag; }
// 入队操作
void enqueue(const T& value) {
if (isFull()) {
cout << "Queue is full.\n";
return;
}
rear = (rear + 1) % capacity;
data[rear] = value;
tag = true;
}
// 出队操作
T dequeue() {
if (isEmpty()) {
cout << "Queue is empty.\n";
return T();
}
T removedValue = data[front];
front = (front + 1) % capacity;
if (front == rear) {
tag = false;
}
return removedValue;
}
// 查看队首元素,但不移除
T getFront() const {
if (isEmpty()) {
cout << "Queue is empty.\n";
return T();
}
return data[front];
}
// 返回队列大小(假设未满)
int getSize() const {
return rear >= front ? rear - front : capacity - front + rear;
}
private:
T data[capacity]; // 存储元素的数组
};
```
接下来是主函数的简单测试:
```cpp
int main() {
CircularQueue<int> queue(5); // 创建一个容量为5的队列
// 测试队列操作
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
cout << "Front element: " << queue.getFront() << endl; // 输出 1
cout << "Size of the queue: " << queue.getSize() << endl; // 输出 3
queue.dequeue(); // 出队,现在 front = 1
queue.enqueue(4); // 队列满,尝试入队 4,输出 "Queue is full."
cout << "After dequeueing and enqueueing: ";
if (!queue.isEmpty()) {
cout << "Front element: " << queue.getFront() << endl; // 输出 2
} else {
cout << "Queue is empty.\n";
}
return 0;
}
```
在这个例子中,我们创建了一个环形队列,进行了入队、出队和查看队首元素的操作,并展示了如何处理队列满的情况。
阅读全文