用一个带头的循环单链表表示一个队列,请写出相应的入队和出队函数,带头循环单链表都是用尾元结点指针标识,很容易获得首元节点,正好对应上rear和front,什么时候队空?这样就可以用一个指针也可以表示链对列
时间: 2024-05-07 09:16:51 浏览: 73
好的,我会为您提供相关的答案。
以下是入队和出队的函数实现代码:
```C++
class Queue {
private:
struct Node { // 链表结点
int data;
Node* next;
Node(int x) : data(x), next(NULL) {}
};
Node* rear; // 队列尾指针(指向尾节点)
public:
Queue() : rear(NULL) {}
~Queue() {
while (!isEmpty()) dequeue(); // 释放链表空间
}
// 入队操作
void enqueue(int x) {
if (isEmpty()) { // 队列为空,添加首元节点
rear = new Node(x);
rear->next = rear; // 首尾相连
} else {
Node* tmp = new Node(x);
tmp->next = rear->next;
rear->next = tmp;
rear = tmp;
}
}
// 出队操作
int dequeue() {
if (isEmpty()) throw "Queue is empty.";
int res = rear->next->data; // 记录返回值
if (rear->next == rear) { // 队列只有1个节点
delete rear;
rear = NULL;
} else {
Node* tmp = rear->next;
rear->next = tmp->next;
delete tmp;
}
return res;
}
// 判断队列是否为空
bool isEmpty() const {
return rear == NULL;
}
};
```
在以上代码中,入队操作和出队操作都只需要常数时间复杂度,因为循环单链表尾节点指针rear可以直接指向队列尾,而不需要在遍历链表中寻找队列尾。
阅读全文