VC++2012编程演练数据结构《1》循环双端队列

来源:互联网 发布:出口网络推广 编辑:程序博客网 时间:2024/06/10 11:18
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。
队列的操作特点是“先进先出”。前者主要是头指针、尾指针的使用,后者主要是理解循环队列提出的原因及其特点。两者都要掌握队列空与满的判定条件以及出队列、入队列操作的实现。

为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。

我们基于VC++2012  IDE来实现之。

启动IDE



首先建立工程



实现代码如下




[cpp] view plaincopy
  1. #include "stdafx.h"  
  2.   
  3.   
  4. //循环双端队列顺序表示  
  5.   
  6. #include <iostream>  
  7. #include <iomanip>  
  8. #include <assert.h>  
  9.   
  10. using namespace std;  
  11. template <class T> class DoubleQueue  
  12. int end1,end2;//end1和end2为端点  
  13. T *data;  
  14. int size;  
  15.  public:  
  16.      DoubleQueue(int sz=10);  
  17.      ~DoubleQueue(){delete[] data;}  
  18.      void Enqueue(T item,int end);  
  19.      void Dequeue(int end);  
  20.      int IsEmpty(){return end1==end2;}  
  21.      int IsFull(){return (end1+1)%size==end2;}  
  22.      void list(int end);  
  23. };  
  24. //循环双端队列操作  
  25. template <class T>  
  26. DoubleQueue <T>::DoubleQueue(int sz):  
  27. end1(0),end2(0),size(sz){  
  28.     data=new T[size];assert(data!=0);  
  29. }  
  30. //循环双端队列插入新元素操作  
  31. template <class T>  
  32. void DoubleQueue <T>::Enqueue(T item,int end)  
  33. { assert(!IsFull());  
  34. if(end==1){  
  35.     end1=(end1+1)%size;  
  36.     data[end1]=item;}  
  37. else{  
  38.     data[end2]=item;  
  39.     end2=(end2-1+size)%size;}  
  40. }  
  41. // 循环双端队列删除操作  
  42. template <class T>  
  43. void DoubleQueue <T>::Dequeue(int end)  
  44. { assert(!IsEmpty());  
  45. if(end==1){  
  46.     end1=(end1+size-1)%size;}  
  47. else{  
  48.     end2=(end2+1)%size;}  
  49. }  
  50. // 循环双端队列输出操作  
  51. template <class T>  
  52. void DoubleQueue <T>::list(int end)  
  53. if(end==1){  
  54.     for(T p=(end2+1)%size;p<=end1;p=(p+1)%size)  
  55.         cout<<setw(3)<<data[p];  
  56.     cout<<endl;}  
  57. else{  
  58.     for(T p=end1;p!=end2;p=(p+size-1)%size)  
  59.         cout<<setw(3)<<data[p];  
  60.     cout<<endl;}  
  61. }  
  62. //循环双端队列的测试  
  63. void main()  
  64. {  
  65. DoubleQueue <int> Q;  
  66. cout<<"运行结果:\n";  
  67. //向队列end1插入4,5,6,7,8 三个元素  
  68. Q.Enqueue(4,1);  
  69. Q.Enqueue(5,1);  
  70. Q.Enqueue(6,1);  
  71. Q.Enqueue(7,1);  
  72. Q.Enqueue(8,1);  
  73. cout<<"输出向队列end1插入4,5,6,7,8三个元素后情况:\n";  
  74. Q.list(1);  
  75. // 删除最后插入的2个元素  
  76. Q.Dequeue(1);  
  77. Q.Dequeue(1);  
  78. cout<<"输出删除最后2个元素后的队列end1的情况:\n";  
  79. Q.list(1);  
  80. //向队列end2插入7,8,9,10,11 三个元素  
  81. Q.Enqueue(7,2);  
  82. Q.Enqueue(8,2);  
  83. Q.Enqueue(9,2);  
  84. Q.Enqueue(10,2);  
  85. Q.Enqueue(11,2);  
  86. cout<<"输出向队列end2插入7,8,9,10,11三个元素后情况:\n";  
  87. Q.list(2);  
  88. cin.get();  
  89.   
  90.   
  91.   
  92. }  


代码下载如下

http://download.csdn.net/detail/yincheng01/4784893

0 0
原创粉丝点击