• 【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
  • 相关阅读:
    Ext2.0布局类初探
    从DHTML、HTC、XHTML到AJAX
    我常用的一些ASP自定义函数
    Javascript的调试利器:Firebug使用详解
    ODBC的多线程应用
    召唤有丰富IOCP实践经验的同行
    欢迎
    关于.NET安装时的dotNETFXRedist_x86.msm
    所谓设计模式
    VC编程经验汇总(一)
  • 原文地址:https://www.cnblogs.com/catnip/p/4328890.html
Copyright © 2020-2023  润新知