c++實現循環隊列


隊列(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    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM