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) };