Ex7_10.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例7.10】顺序存储方式的循环队列类模板。
  2. #include<cassert>
  3. #include<iostream>
  4. using namespace std;
  5. template<typename T>class Queue{
  6. int rear,front; //队尾与队头
  7. T *elements; //存放队列元素的容器
  8. int maxSize;                      //队列最多可容纳元素个数+1
  9. public:
  10. Queue(int ms=18);
  11. ~Queue(){delete[] elements;}
  12. bool IsEmpty() const {return front==rear;}  //判队空
  13. bool IsFull() const {return (rear+1)%maxSize==front;} //判队满
  14. int Length() const {return  (rear-front+maxSize)%maxSize;}   
  15. //求队中元素数,注意:求余算法是实现循环队列的基础算法
  16. void EnQue(const T &data);  //进队
  17. T DeQue();  //出队
  18. T GetFront();  //取队头数据
  19. void MakeEmpty(){front=rear=0;}  //队置空(初始态)
  20. };
  21. template<typename T> Queue<T>::Queue(int ms){
  22. maxSize=ms;
  23. elements=new T[maxSize];
  24. rear=front=0;
  25. assert(elements!=NULL);  //断言:分配成功
  26. }
  27. template<typename T> void Queue<T>::EnQue(const T &data){  //进队
  28. assert(!IsFull());  //断言:队列不满,不满才能进队
  29. rear=(rear+1)%maxSize;  //队尾指针加1
  30. elements[rear]=data;
  31. }
  32. template<typename T>T Queue<T>::DeQue(){
  33. assert(!IsEmpty());
  34. front=(front+1)%maxSize;  //队头指针加1
  35. return elements[front];   //注意front指向现在队头的前一位置
  36. }
  37. template<typename T>T Queue<T>::GetFront(){
  38. assert(!IsEmpty());
  39. return elements[(front+1)%maxSize];  //注意加1才能返回队头数据
  40. }
  41. int main(){
  42. int i;
  43. Queue<char> que;                             //缺省为18元素队列,可用17
  44. char str1[]="abcdefghijklmnop";//17个元素,包括串结束符
  45. que.MakeEmpty();
  46. for(i=0;i<17;i++) que.EnQue(str1[i]);
  47. if(que.IsFull()) cout<<"队满";
  48. cout<<"共有元素:"<<que.Length()<<endl;
  49. for(i=0;i<17;i++) cout<<que.DeQue();           //先进先出
  50. cout<<endl;
  51. if(que.IsEmpty()) cout<<"队空";
  52. cout<<"共有元素:"<<que.Length()<<endl;
  53. return 0;
  54. }