设计一个循环队列,用 front 和 rear 分别作为队头和队尾指针,另外用一个标志 tag 标志队列可能空(tag=0)或可能满(tag=1),这样加上front==rear可以作为队空或队满的条件。要求设计队列的相关基本运算算法。C++
时间: 2024-10-20 20:02:55 浏览: 48
设计一个循环队列(Circular Queue)的基本操作通常包括初始化、入队(enqueue)、出队(dequeue)以及检查队列是否为空或满的操作。以下是C++的简单实现:
```cpp
template <typename T>
class CircularQueue {
private:
int front, rear; // 队头和队尾指针
int size;
T* queue; // 存储元素的数组
bool tag; // 标记队列状态
public:
// 初始化队列,容量为n
CircularQueue(int n) : front(0), rear(0), size(n), queue(new T[size]), tag(false) {}
// 检查队列是否为空
bool isEmpty() const {
return front == rear && !tag;
}
// 检查队列是否已满
bool isFull() const {
return (rear + 1) % size == front && tag;
}
// 入队操作
void enqueue(const T& value) {
if (isFull()) {
tag = true; // 设置标记为满
} else {
rear = (rear + 1) % size; // 循环队列更新 rear
queue[rear] = value;
tag = false; // 清除满的标记
}
}
// 出队操作
T dequeue() {
if (isEmpty()) {
throw std::runtime_error("Queue is empty"); // 如果队列为空抛异常
} else {
T result = queue[front];
front = (front + 1) % size; // 更新 front
tag = false; // 清除空的标记
return result;
}
}
~CircularQueue() { // 析构函数释放内存
delete[] queue;
}
};
```
在这个实现中,我们首先检查队列是否空或满,然后根据实际情况进行入队或出队操作。注意,在出队操作中如果队列为空会抛出异常。
阅读全文