C++用类实现带头指针和尾指针的队列模板
时间: 2023-07-30 22:06:16 浏览: 77
好的,以下是C++类实现带头指针和尾指针的队列模板的示例代码:
```c++
template <typename T>
class Queue {
private:
struct Node {
T data;
Node* next;
Node(const T& d, Node* n = nullptr) : data(d), next(n) {}
Node() : next(nullptr) {}
};
Node* head; // 头指针
Node* tail; // 尾指针
public:
Queue() : head(nullptr), tail(nullptr) {}
~Queue() {
while (head) {
Node* temp = head;
head = head->next;
delete temp;
}
tail = nullptr;
}
bool empty() const {
return head == nullptr;
}
void push(const T& val) {
Node* newNode = new Node(val);
if (empty()) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
void pop() {
if (empty()) {
throw std::out_of_range("Queue is empty");
}
Node* temp = head;
head = head->next;
if (!head) {
tail = nullptr;
}
delete temp;
}
T& front() {
if (empty()) {
throw std::out_of_range("Queue is empty");
}
return head->data;
}
const T& front() const {
if (empty()) {
throw std::out_of_range("Queue is empty");
}
return head->data;
}
T& back() {
if (empty()) {
throw std::out_of_range("Queue is empty");
}
return tail->data;
}
const T& back() const {
if (empty()) {
throw std::out_of_range("Queue is empty");
}
return tail->data;
}
};
```
在这个实现中,我们使用了一个 `Node` 结构体来表示队列中的每个节点,其中包括节点的数据 `data` 和指向下一个节点的指针 `next`。在 `Queue` 类中,我们使用头指针 `head` 和尾指针 `tail` 来表示队列的头部和尾部。当队列为空时,`head` 和 `tail` 都指向 `nullptr`。
在 `push` 操作中,我们创建一个新的节点并将其添加到队列的末尾。如果队列为空,则将 `head` 和 `tail` 都设置为新节点。否则,我们将当前尾节点的 `next` 指针指向新节点,并将 `tail` 指向新节点。
在 `pop` 操作中,我们删除队列的头部节点,并将 `head` 指针指向下一个节点。如果队列为空,则抛出一个 `std::out_of_range` 异常。
在 `front` 和 `back` 操作中,我们分别返回队列的头部和尾部节点的数据。如果队列为空,则抛出一个 `std::out_of_range` 异常。
注意,这个实现中没有使用模板继承或模板特化,因此可以在单个头文件中定义整个类。
阅读全文