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