基本数据结构:队列(queue

作者:C小加 更新时间:2012-8-2

像栈一样,队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端。就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人。如图1,描述了一个队列模型。


基本数据结构:队列(queue)_数据结构

和栈一样,队列也有数组实现和链表实现两种,两种实现都能给出快速的O(1)运行时间,区别在于链表实现指针域要占用空间,频繁的newdelete会消耗不少的时间开销,数组实现唯一的缺点是建立时要确定空间大小。

假如一个队列最多只能站10个人,当占满10个人后,第11个人就不能入队,这种情况成为溢出。而如果第一个人出队了,剩下的9个人依然还在原来的位置,队列里空出了一个位置,但第11个人还是不能入队,这种情况成为假溢出。克服假溢出有效的办法是使用循环队列。

循环队列就是把队尾和队首连接起来,形成一个环,队尾的下一个位置就是队首,这样可以有效的防止假溢出现象,但队列的实际容量已然固定。

队列的实现

队列的数组实现和栈差不多,不同的是,栈用top做下标,队列用frontrear作为下标。

我更改了单链表的模板来实现一个简单的队列。代码仅供学习,不足之处还请指明,我会对不足之处进行修改和更新。

代码如下:

 

  1. template<class T> 
  2.  
  3. class queueNode 
  4.  
  5.  
  6.     public
  7.  
  8.     queueNode():next(NULL){} 
  9.  
  10.     T data;//值 
  11.  
  12.     queueNode* next;//指向下一个节点的指针 
  13.  
  14. }; 
  15.  
  16. template<class T> 
  17.  
  18. class myqueue 
  19.  
  20.  
  21.     private
  22.  
  23.     unsigned int queuelength; 
  24.  
  25.     queueNode<T>* node;//临时节点 
  26.  
  27.     queueNode<T>* rear;//队尾 
  28.  
  29.     queueNode<T>* front;//队首 
  30.  
  31.     public
  32.  
  33.         myqueue();//初始化 
  34.  
  35.         unsigned int length();//队列元素的个数 
  36.  
  37.         void push(T x);//入队 
  38.  
  39.         bool isEmpty();//判断队列是否为空 
  40.  
  41.         void pop();//出队 
  42.  
  43.         T getHead();//获得队首元素 
  44.  
  45.   
  46.  
  47. }; 
  48.  
  49. template<class T> 
  50.  
  51. myqueue<T>::myqueue() 
  52.  
  53.  
  54.     node=NULL; 
  55.  
  56.     rear=NULL; 
  57.  
  58.     front=NULL; 
  59.  
  60.     queuelength=0; 
  61.  
  62.  
  63. template<class T> 
  64.  
  65. inline unsigned int myqueue<T>::length(){return queuelength;} 
  66.  
  67.   
  68.  
  69. template<class T> 
  70.  
  71. void  myqueue<T>::push(T x) 
  72.  
  73.  
  74.     node=new queueNode<T>();//申请一个新的节点 
  75.  
  76.     node->data=x;//新节点赋值为x 
  77.  
  78.     if(rear==NULL)//如果没有尾节点则队列为空,node既为队首,又是队尾 
  79.  
  80.     { 
  81.  
  82.         front=node; 
  83.  
  84.         rear=node; 
  85.  
  86.     } 
  87.  
  88.     else//如果队列非空 
  89.  
  90.     { 
  91.  
  92.         rear->next=node;//node既为尾节点的下一个节点 
  93.  
  94.         rear=node;//node变成了尾节点,把尾节点赋值为node 
  95.  
  96.     } 
  97.  
  98.     ++queuelength;//元素个数+1 
  99.  
  100.  
  101. template<class T> 
  102.  
  103. bool  myqueue<T>::isEmpty() 
  104.  
  105.  
  106.     return queuelength==0; 
  107.  
  108.  
  109. template<class T> 
  110.  
  111. void  myqueue<T>::pop() 
  112.  
  113.  
  114.     if(queuelength==0) return
  115.  
  116.     node=front; 
  117.  
  118.     front=front->next; 
  119.  
  120.     delete(node); 
  121.  
  122.     --queuelength; 
  123.  
  124.  
  125. template<class T> 
  126.  
  127. T  myqueue<T>::getHead() 
  128.  
  129.  
  130.     return front->data; 
  131.  

队列的应用

打印机处理作业采用的就是队列结构,它们会按照提交的顺序排列起来。STL也给出了一个强大的队列,我们直接可以去用它。

队列相关问题

如何用两个栈模拟一个队列,如果用两个队列模拟一个栈?