【Weiss】【第03章】队列例程

前几个例程还是相当简单的,把链表即时改了一下就是队列了。

还有想了一下,决定这种例程的代码放法是:先把测试代码默认折叠放在前面,然后把实现代码默认展开放在后面。

测试代码如下:

 1 #include <iostream>
 2 #include "queue.h"
 3 using namespace std;
 4 using namespace queue;
 5 template class Queue<int>;
 6 int main(void)
 7 {
 8     Queue<int> number;
 9 
10     //测试插入
11     cout << "/*additem()*/" << endl;
12     number.enqueue(2);
13     number.enqueue(3);
14     number.enqueue(5);
15     number.enqueue(7);
16     number.enqueue(11);
17     number.traverse();
18     cout << "
/*end*/

" << flush;
19 
20     //测试获取长度
21     cout << "/*length()*/" << endl;
22     cout << number.size() << endl;
23     cout << "/*end*/

" << flush;
24 
25     //测试获得头元素
26     cout << "/*getfirst()*/" << endl;
27     cout << number.getfirst() << endl;
28     cout << "/*end*/

" << flush;
29 
30     //测试获得尾元素
31     cout << "/*getfirst()*/" << endl;
32     cout << number.getlast() << endl;
33     cout << "/*end*/

" << flush;
34 
35     //测试出队
36     cout << "/*remove()*/" << endl;
37     number.dequeue();
38     number.dequeue();
39     number.traverse();
40     cout << "
/*end*/

" << flush;
41 
42     //测试清空,并测试从空表中出队
43     cout << "/*clear(),remove()*/" << endl;
44     number.clear();
45     number.dequeue();
46     cout << "/*end*/

" << flush;
47 
48     system("pause");
49 }
View Code

队列实现代码如下:

  1 #ifndef QUEUE
  2 #define QUEUE
  3 #include <iostream>
  4 using namespace std;
  5 
  6 namespace queue
  7 {
  8 
  9 //节点模板
 10 template <typename T> struct Node
 11 {
 12     Node<T>() : next(nullptr){}
 13     Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){}
 14     T data;
 15     Node<T>* next;
 16 };
 17 //头节点及主体操作
 18 template <typename T> class Queue
 19 {
 20 //构造函数
 21 public:
 22     Queue<T>() : length(0), front(nullptr), rear(nullptr){}
 23 //接口
 24 public:
 25     //返回长度
 26     unsigned int size()const{ return length; }
 27     //返回头指针
 28     Node<T>* begin()const{ return front; }
 29     //判断是否为空
 30     bool empty()const{ return length == 0; }
 31     //获得头元素
 32     T getfirst()const{ return front->data; }
 33     //获得尾元素
 34     T getlast()const{ return rear->data; }
 35     //#查找元素所在地址
 36     Node<T>* find(const T &item)const;
 37     //#入队,插入队尾
 38     bool enqueue(const T &item);
 39     //#出队,删除队首元素
 40     bool dequeue();
 41     //#遍历并输出队列元素
 42     void traverse()const;
 43     //#清空队列
 44     void clear();
 45 
 46 //辅助函数
 47 private:
 48     //#查找元素前驱
 49     Node<T>* find_prev(const T& item)const;
 50 //数据
 51 private:
 52     unsigned int length;
 53     Node<T>* front;
 54     Node<T>* rear;
 55 };
 56 
 57 //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱
 58 template <typename T> Node<T>* Queue<T>::find_prev(const T& item)const
 59 {
 60     if (length == 0)
 61         return nullptr;
 62     if (front->data == item)
 63         return nullptr;
 64     for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next)
 65     {
 66         if (iter->next->data == item)
 67             return iter;
 68     }
 69     return nullptr;
 70 }
 71 //调用find_prev,如果元素存在则返回地址,不存在则返回nullptr
 72 template <typename T> Node<T>* Queue<T>::find(const T &item)const
 73 {
 74     Node<T>* iter = find_prev(item);
 75     if (length == 0)
 76         return nullptr;
 77     if (front->data == item)
 78         return front;
 79     return iter->next;
 80 }
 81 template <typename T> bool Queue<T>::enqueue(const T &item)
 82 {
 83     Node<T>* pnew = new Node<T>(item);
 84     if (length == 0)
 85         front = rear = pnew;
 86     else
 87     {
 88         rear->next = pnew;
 89         rear = rear->next;
 90     }
 91     ++length;
 92     return true;
 93 }
 94 template <typename T> bool Queue<T>::dequeue()
 95 {
 96     if (length == 0)                    
 97     {
 98         cout << "No data!" << endl;
 99         return false;
100     }
101     Node<T>* save = front;
102     front = front->next;
103     //如果出队后队列为空,则尾指针同时置空
104     if (length == 1)        
105         rear = nullptr;
106     delete save;
107     --length;
108     return true;
109 }
110 template <typename T> void Queue<T>::traverse()const
111 {
112     if (length != 0)
113     {
114         for (Node<T>* iter = front; iter != nullptr; iter = iter->next)
115             cout << iter->data << ends;
116     }
117 }
118 template <typename T> void Queue<T>::clear()
119 {
120     Node<T>* iter;
121     while (front != nullptr)
122     {
123         iter = front;
124         front = front->next;
125         delete iter;
126     }
127     front = rear = nullptr;
128     length = 0;
129 }
130 
131 }
132 #endif
原文地址:https://www.cnblogs.com/catnip/p/4328890.html