文章目录
LeetCode 622.设计循环队列
循环队列 --> 解决假溢出
class MyCircularQueue {
public:
vector<int> arr;
int head, tail, cnt;
MyCircularQueue(int k) : arr(k), head(0), tail(0),cnt(0) {}
bool enQueue(int value) {
if(isFull()) return false;
arr[tail] = value;
tail = (tail + 1) % arr.size();
cnt += 1;
return true;
}
bool deQueue() {
if(isEmpty()) return false;
//出队
head = (head + 1) % arr.size();
cnt -= 1;
return true;
}
int Front() {
if(isEmpty()) return -1;
return arr[head];
}
int Rear() {
if(isEmpty()) return -1;
//老办法
//int ind = tail - 1;
//if(ind == -1) ind = arr.size() - 1;
//return arr[ind];
return arr[(tail - 1 + arr.size()) % arr.size()];
//下标为0时候,往前走一位,变为下标n - 1
}
bool isEmpty() {
return cnt == 0;
}
bool isFull() {
return cnt == arr.size();
}
};
/**
* 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();
*/