zoukankan      html  css  js  c++  java
  • 队列的链表方式实现

    1、像堆栈一样,也可以使用链表来实现一个队列。此时需要两个变量 f r o n t和r e a r来分别跟踪队列的两端,这时有两种可能的情形:从 f r o n t开始链接到 r e a r(如a所示)或从 r e a r开始链接到f r o n t(如图 b所示) 。不同的链接方向将使添加和删除操作的难易程度有所不同。图 6 - 8和6 - 9分别演示了添加元素和删除元素的过程。可以看到,两种链接方向都很适合于添加操作,而从f r o n t到r e a r的链接更便于删除操作的执行。因此,我们将采用从 f r o n t到r e a r的链接模式。可以取初值 f r o n t = r e a r = 0,并且认定当且仅当队列为空时 f r o n t = 0。






    2、链表队列的实现

    节点定义:Node.h

     1 #ifndef NODE_H
     2 #define NODE_H
     3 template<class T>
     4 class LinkedQueue;//声明模板类
     5 
     6 template<class T>
     7 class Node
     8 {
     9     friend class LinkedQueue<T>;//声明为友元,因为需要访问Node的私有成员
    10     friend std::ostream& operator<<(std::ostream& output, const LinkedQueue<T>& q);
    11 private:
    12     Node<T> *next;
    13     T data;
    14 };
    15 #endif

    链表队列:

      1 #ifndef LINKEDQUEUE_H
      2 #define LINKEDQUEUE_H
      3 #include <iostream>
      4 #include <new>
      5 #include "Node.h"
      6 #include "exceptionerror.h"
      7 
      8 template<class T>
      9 class LinkedQueue
     10 {
     11 public:
     12     LinkedQueue():front(0),rear(0){}
     13     ~LinkedQueue();
     14     friend std::ostream& operator<<(std::ostream& output,const LinkedQueue<T>& q)
     15     {
     16         if (q.IsEmpty())
     17         {
     18             output << "empty queue" << std::endl;
     19         }
     20         else
     21         {
     22             Node<T>* p = q.front;
     23             while (p)
     24             {
     25                 output << p->data << " ";
     26                 p = p->next;
     27             }            
     28         }
     29 
     30         return output;
     31     }
     32     bool IsEmpty()const{ return front == 0; }
     33     bool IsFull()const;
     34     T First()const;//返回第一个元素
     35     T Last()const;//返回最后一个元素
     36     LinkedQueue<T>& Add(const T& x);//添加元素
     37     LinkedQueue<T>& Delete(T& x);//删除元素
     38     int Quantity()const;//返回元素个数
     39 private:
     40     Node<T> *front;
     41     Node<T> *rear;
     42 };
     43 
     44 template<class T>
     45 LinkedQueue<T>::~LinkedQueue()
     46 {
     47     Node<T>* next;
     48     while (front)
     49     {
     50         next = front->next;
     51         delete front;
     52         front = next;
     53     }
     54 }
     55 
     56 template<class T>
     57 bool LinkedQueue<T>::IsFull()const
     58 {
     59     Node<T>* p;
     60     try
     61     {
     62         p = new Node<T>;
     63         delete p;
     64         return false;
     65     }
     66     catch (CMemoryException* e)
     67     {
     68         return true;
     69     }
     70 }
     71 
     72 template<class T>
     73 T LinkedQueue<T>::First()const
     74 {
     75     if (IsEmpty())
     76     {
     77         throw OutofBounds();
     78     }
     79 
     80     return front->data;
     81 }
     82 
     83 template<class T>
     84 T LinkedQueue<T>::Last()const
     85 {
     86     if (IsEmpty())
     87     {
     88         throw OutofBounds();
     89     }
     90 
     91     return rear->data;
     92 }
     93 
     94 template<class T>
     95 LinkedQueue<T>& LinkedQueue<T>::Add(const T& x)
     96 {
     97     Node<T> *p = new Node<T>;
     98     p->data = x;
     99     p->next = 0;
    100     if (front)
    101     {
    102         rear->next = p;
    103     }
    104     else front = p;
    105 
    106     rear = p;
    107     return *this;
    108 }
    109 
    110 template<class T>
    111 LinkedQueue<T>& LinkedQueue<T>::Delete(T& x)
    112 {
    113     if (IsEmpty())
    114     {
    115         throw OutofBounds();
    116     }
    117     x = front->data;
    118     Node<T>* p = front;//为了释放front空间
    119     front = front->next;
    120     delete p;
    121 
    122     return *this;
    123 }
    124 
    125 template<class T>
    126 int LinkedQueue<T>::Quantity()const
    127 {
    128     if (IsEmpty())
    129     {
    130         return 0;
    131     }
    132     int count = 0;
    133     Node<T>* p = front;
    134     while (p)
    135     {
    136         p=p->next;
    137         count++;
    138     }
    139 
    140     return count;
    141 }
    142 #endif

    测试代码:

     1 #include "LinkedQueue.h"
     2 
     3 int main()
     4 {
     5     LinkedQueue<int> Q;
     6     std::cout << "Q is Empty? "<<Q.IsEmpty() << std::endl;
     7     Q.Add(1);
     8     Q.Add(2);
     9     Q.Add(3);
    10     Q.Add(4);
    11     Q.Add(5);
    12     Q.Add(6);
    13     Q.Add(7);
    14     Q.Add(8);
    15     std::cout << "Quantity of Q is " << Q.Quantity() << std::endl;
    16     std::cout << "Q is:" << std::endl;
    17     std::cout << Q << std::endl;
    18     int x;
    19     Q.Delete(x);
    20     std::cout << "The num deleted is " << x << std::endl;
    21     std::cout << "Quantity of Q is " << Q.Quantity() << std::endl;
    22     std::cout << "Q is:" << std::endl;
    23     std::cout << Q << std::endl;
    24     system("pause");
    25     return 0;
    26 }

    输出:

  • 相关阅读:
    Aspnetcore2.0中Entityframeworkcore及Autofac的使用(一)(附Demo)
    Aspnetcore2.0中Entityframeworkcore及Autofac的使用(二)(附Demo)(
    Asp.net MVC模型数据验证扩展ValidationAttribute
    Asp.net MVC中如何实现依赖注入(DI)(二)
    Asp.net MVC中如何实现依赖注入(DI)(一)
    Asp.net中接口签名与验签常用方法
    Win10系统安装MongoDB教程及错误代码100解决办法
    MVC导出Excel之NPOI简单使用(一)
    sqlserver merge 操作符
    sqlserver 递归查询
  • 原文地址:https://www.cnblogs.com/haoliuhust/p/4256084.html
Copyright © 2011-2022 走看看