c++实现循环队列

筅森魡賤 提交于 2019-11-30 07:57:42

队列(queue)是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出(First In First Out)的线性表,简称FIFO。

允许插入的一端称为队尾,允许删除的一端称为队头。

因为已经限制了插入和删除的位置,所以对于队列,插入和删除时只需要考虑满和空两种状态

 

顺序队列的操作分别在队头和队尾两端进行。在出队时,队头_front和队尾_rear的值都是只增加(向队列长度_size)靠近;如果仅通过_rear == _size来判断顺序队列是否满队,此时可能存在_rear已经指向_size,同时_front > 0(已有元素出队),顺序队列中实际的元素个数远小于_size而不能做入队操作的情况,导致元素出队后的空闲存储空间永远无法重用,造成假上溢。如下图:

此时再添加元素 _rear 就超出大小  但已经有出队元素  造成前面空间浪费因此让_rear跑的0号位置 实现循环

所以

_front=(_front+1)%_size        _rear=(_rear+1)%_szie    实现循环

因此可以看成一个圆环进行存储

通过分析要实现这个循环队列需要成员变量有

    int * _pQue;    //指向申请的kongjian
    int _front;       // 队头
    int _rear;        //队尾
    int _size         //记录空间的大小

封装在类中实现为

  1  #include<iostream>
  2  #include<stdlib.h>
  3  #include<string.h>
  4  using namespace std;
  5     
  6   class Queue
  7 {
  8    public:
  9     Queue(int size=10)      //  构造函数
 10     {
 11         _pQue=new int[size];
 12         _front=0;
 13         _rear=0;
 14         _size=size;
 15      }
 16     ~Queue()              //析构函数
 17     {
 18       delete []_pQue;
 19       _pQue=nullptr;
 20     }
 21     Queue(const Queue &que)      //拷贝构造函数(防止浅拷贝)
 22     {
 23       _PQue=new int[que._size];
 24       int i=que._front;
 25       for(;i!=que._rear;i=(i+1)%que._size)
 26          {
 27           _pQue[i]=que._pQue[i];
 28          }
 29          _front=que._front;
 30          _rear=que._rear;
 31          _size=que._size;
 32     }
 33     Queue & operator=(const Queue &que)     //赋值构造函数  返回地址  可以实现连续赋值
 34     {
 35       if(this==&que)
 36          {
 37             return *this;
 38           }
 39          delete []_pQue;
 40          _pQue=new int[que._size];
 41          int i=que._front;
 42          for(;i!=que._rear;i=(i+1)%que._size)
 43             {
 44               _pQue[i]=que._pQue[i];
 45             }
 46             _front=que._front;
 47             _rear=que._rear;
 48             _size=que._szie;
 49             return *this;
 50     }
 51     Queue(Queue &&que)                     //右值拷贝函数  防止临时量对空间时间的浪费
 52     {
 53       _pQue=que._pQue;
 54       _front=que._front;
 55       _rear=que._rear;
 56       _size=que._size;
 57       que._pQue=nullptr;
 58     }
 59     Queue & operator=(Queue &&que)           //  右值赋值构造函数   防止临时量对空间时间的浪费
 60     {
 61      delete []_pQue;
 62      _pQue=que._pQue;
 63      _front=que._front;
 64      _rear=que._rear;
 65      _size=que._size;
 66      que._pQue=nullptr;
 67       return *this;
 68     }
 69     void addQue(int val)                   //队尾插入
 70     {
 71       if(full())
 72        {
 73         resize();
 74        }    
 75       _pQue[_rear]=val;
 76      _rear=(_rear+1)%_size;
 77     }
 78     void delQue()                       //  出队
 79     {    
 80      if(empty())
 81        { 
 82         return;
 83        }
 84        _front=(_front+1)%_size;
 85      
 86     }
 87     int front()                  // 返回队头元素
 88     {    
 89      return  _pQue[_front];
 90     }
 91     int back()                   //返回队尾元素
 92     {    
 93      return _pQue[_rear-1+_size]%_size;
 94     }
 95     bool empty()               //  是否队空
 96     { 
 97      return _front==_rear;   
 98     }
 99     bool full()         //  是否对满         
100     {    
101        return (_rear+1)%_size==_front;
102     }
103  private:
104     int *_pQue;           //指向申请的空间地址
105     int _front;           //  队头
106     int _rear;            //   队尾
107     int _size;            //  空间大小
108     void resize()         //   2倍扩容函数
109     {    
110      int *tmp=new int[_size*2];
111      int i=_front;
112      int j=0;
113      for(i;i!=_rear;i=(i+1)%_size)
114        {
115          tmp[j++]=_pQue[i];
116        }
117        _front=0;
118        _rear=j;
119        delete []_pQue;
120        _pQue=tmp;
121        tmp=nullptr;
122        _size*=2;
123       }    
124     };           
125    int main()
126 {
127 Queue st1(5);
128    int i=0;
129    for(;i<10;i++)
130    {
131    st1.addQue(i);
132    cout<<st1.front()<<endl;
133    st1.delQue();
134    }
135     cout<<endl;
136     return 0;
137 }
138    

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!