数据结构与算法设计---链式队列的实现(C++)
跟链式栈差不多,不过重载操作符更加复杂一点,注释就不写了,测试函数随便了点,编程环境是VS2013,如果发现bug的话,欢迎评论区批评指正,非常感谢!
#include<iostream>
#include<vector>
using namespace std;
enum Error_code
{
success, overflow, underflow
};
template<class Node_entry>
struct Node{
Node_entry entry;
Node*next;
Node();
Node(Node_entry item, Node*add_on = NULL);
};
template<class Queue_entry>
class Queue {
public:
Queue();
bool empty() const;
Error_code append(const Queue_entry&item);
Error_code serve();
Error_code retrieve(Queue_entry &item) const;
~Queue();
Queue(const Queue&original);
void operator = (const Queue &original);
private:
Node<Queue_entry>*front, *rear;;
};
template<class Node_entry>
Node<Node_entry>::Node() {
next = NULL;
}
template<class Node_entry>
Node<Node_entry>::Node(Node_entry item, Node*add_on = NULL) {
next = add_on;
entry = item;
}
template<class Queue_entry>
Queue<Queue_entry>::Queue() {
front = rear = NULL;
}
template<class Queue_entry>
Queue<Queue_entry>::~Queue() {
while (!empty())
serve();
}
template<class Queue_entry>
bool Queue<Queue_entry>::empty() const {
return front == NULL;
}
template<class Queue_entry>
Error_code Queue<Queue_entry>::append(const Queue_entry&item) {
Node<Queue_entry>*new_rear = new Node<Queue_entry>(item);
if (new_rear == NULL) return overflow;
if (rear == NULL) front = rear = new_rear;
else {
rear->next = new_rear;
rear = new_rear;
}
return success;
}
template<class Queue_entry>
Error_code Queue<Queue_entry>::serve() {
if (front == NULL) return underflow;
Node<Queue_entry>*old_node = front;
front = front->next;
if (front == NULL) rear = NULL;
delete old_node;
return success;
}
template<class Queue_entry>
Error_code Queue<Queue_entry>::retrieve(Queue_entry &item) const {
if (front == NULL) return overflow;
front->entry = item;
return success;
}
template<class Queue_entry>
void Queue<Queue_entry>::operator = (const Queue &original) {
Node<Queue_entry>*new_front = original.front, *new_rear, *copy;
if (new_front == NULL) new_rear = NULL;
else {
copy = original.front;
new_rear = new_front = new Node<Queue_entry>(original.front->entry);
while (copy->next != 0) {
copy = copy->next;
new_rear->next = new Node<Queue_entry>(copy->entry);
new_rear = new_rear->next;
}
}
while (!empty())
serve();
front = new_front;
rear = new_rear;
}
template<class Queue_entry>
Queue<Queue_entry>::Queue(const Queue&original) {
*this = original;
}
int main() {
Queue<int> queue;
int temp;
for (int i = 0; i < 10; i++) {
cin >> temp;
queue.append(temp);
}
cout << queue.empty() << endl;
cin >> temp;
Queue<int> queue2 = queue;
queue.retrieve(temp);
for (int i = 0; i < 10; i++) {
queue.serve();
}
cout << queue.empty() << endl;
cout << queue2.empty() << endl;
}