如果允许在循环队列的两端都可以进行插入和删除操作。要求: ① 写出循环队列的类型定义; ② 写出“从队尾删除”和“从队头插入”的算法。
时间: 2024-10-07 07:08:16 浏览: 35
嵌入式软件面试题整理.pdf
循环队列是一种特殊的线性表,它的特点是当队列满时,新元素会从第一个位置开始覆盖旧元素,而最后一个元素依然可以作为新的入队位置,形成了一个循环。为了支持在两端同时进行插入和删除操作,我们需要设计如下的数据结构:
```cpp
template <typename T>
class CircularQueue {
private:
std::size_t front; // 队头指针
std::size_t rear; // 队尾指针
std::vector<T> data; // 存储元素的动态数组
public:
// 构造函数,初始化队列大小
explicit CircularQueue(std::size_t capacity) : front(0), rear(0), data(capacity) {}
// 插入元素到队尾
void enqueue(const T& value) {
if ((rear + 1) % data.size() == front) { // 判断是否已满
throw std::runtime_error("Queue is full");
}
data[rear] = value;
rear = (rear + 1) % data.size(); // 更新队尾
}
// 从队头删除元素
T dequeue() {
if (front == rear) { // 判断队列是否为空
throw std::runtime_error("Queue is empty");
}
T removedValue = data[front];
front = (front + 1) % data.size(); // 更新队头
return removedValue;
}
// 其他辅助成员函数(例如检查队列是否为空等)
};
```
阅读全文