622. 設計迴圈佇列
阿新 • • 發佈:2021-01-06
技術標籤:leetcode題目資料結構leetcode資料結構佇列
迴圈佇列的一個好處是我們可以利用這個佇列之前用過的空間。在一個普通佇列裡,一旦一個佇列滿了,我們就不能插入下一個元素,即使在佇列前面仍有空間。但是使用迴圈佇列,我們能使用這些空間去儲存新的值。
你的實現應該支援如下操作:
MyCircularQueue(k): 構造器,設定佇列長度為 k 。
Front: 從隊首獲取元素。如果佇列為空,返回 -1 。
Rear: 獲取隊尾元素。如果佇列為空,返回 -1 。
enQueue(value): 向迴圈佇列插入一個元素。如果成功插入則返回真。
deQueue(): 從迴圈佇列中刪除一個元素。如果成功刪除則返回真。
isFull(): 檢查迴圈佇列是否已滿。
詳細題目可檢視leetcodehttps://leetcode-cn.com/problems/design-circular-queue/
解題思路
利用一維陣列模擬迴圈佇列,這裡為了判空條件,預留的陣列長度為k+1,tail指向的是當前佇列尾元素的下一個位置。假如預留長度為k,當佇列滿時,head==tail會使得判空條件失效。
另外,陣列尾元素是 (tail-1+maxlen)%maxlen而非(tail-1)%maxlen
class MyCircularQueue { public: MyCircularQueue(int k) { maxlen = k+1; data.reserve(k+1); head = 0; tail = 0; count = 0; } bool enQueue(int value) { if(isFull()) return false; data[tail] = value; tail = (tail+1)%maxlen; count++; return true; } bool deQueue() { if(isEmpty()) return false; head = (head+1)%maxlen; count--; return true; } int Front() { if(isEmpty()) return -1; return data[head]; } int Rear() { if(isEmpty()) return -1; return data[(tail-1+maxlen)%maxlen]; } bool isEmpty() { //count == 0 判斷報錯? if(head == tail) return true; return false; } bool isFull() { if(count == maxlen-1) return true; return false; } private: vector<int> data; int head,tail; int maxlen,count; }; /** * Your MyCircularQueue object will be instantiated and called as such: * MyCircularQueue* obj = new MyCircularQueue(k); * bool param_1 = obj->enQueue(value); * bool param_2 = obj->deQueue(); * int param_3 = obj->Front(); * int param_4 = obj->Rear(); * bool param_5 = obj->isEmpty(); * bool param_6 = obj->isFull(); */