1. 程式人生 > 其它 >622. 設計迴圈佇列

622. 設計迴圈佇列

技術標籤:leetcode題目資料結構leetcode資料結構佇列

迴圈佇列的一個好處是我們可以利用這個佇列之前用過的空間。在一個普通佇列裡,一旦一個佇列滿了,我們就不能插入下一個元素,即使在佇列前面仍有空間。但是使用迴圈佇列,我們能使用這些空間去儲存新的值。

你的實現應該支援如下操作:

MyCircularQueue(k): 構造器,設定佇列長度為 k 。
Front: 從隊首獲取元素。如果佇列為空,返回 -1 。
Rear: 獲取隊尾元素。如果佇列為空,返回 -1 。
enQueue(value): 向迴圈佇列插入一個元素。如果成功插入則返回真。
deQueue(): 從迴圈佇列中刪除一個元素。如果成功刪除則返回真。

isEmpty(): 檢查迴圈佇列是否為空。
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();
 */