leetcode 设计循环队列 中等

 

 

利用一个空余的结点来区别判空和判满。

判空则是 return l == r;

判满则是 return (r + 1) % queSize == l;

如果空间大小不开 k + 1,且 queSize 不为 k + 1,那么 当 r 为 k - 1 时,只是用到了 [0, k - 2] 个位置,并且 r + 1 之后为 k,此时取模 queSize,得到 r = 0.

所以这种判满方式需要牺牲一个空余结点.

class MyCircularQueue {
public:
    MyCircularQueue(int k) {
        queSize = k + 1;
        que.resize(k + 1, 0);
    }

    bool enQueue(int value) {
        if(isFull()) return false;
        que[r ++] = value;
        if(r == queSize) r = 0;
        return true;
    }

    bool deQueue() {
        if(isEmpty()) return false;
        ++ l;
        if(l == queSize) l = 0;
        return true;
    }

    int Front() {
        if(isEmpty()) return -1;
        return que[l];
    }

    int Rear() {
        if(isEmpty()) return -1;
        return que[(r - 1 + queSize) % queSize];
    }

    bool isEmpty() {
        return l == r;
    }

    bool isFull() {
        return (r + 1) % queSize == l;
    }

private:
    int queSize;
    vector<int> que;
    int l = 0, r = 0;       // 队列范围为 [l, r)
};

 

posted @ 2021-09-21 16:03  rookie_Acmer  阅读(24)  评论(0编辑  收藏  举报