之所以要用模操作,就是为了防止数组下标越界 ,当last指向0时,如果在使用delete的话会使last = -1,直接数组越界报错;
class MyCircularDeque {
public:
vector<int> q;
int last,front,sz,n;
MyCircularDeque(int k) {
q.resize(k);
last = front = 0;
sz = k;
n = 0;
}
bool insertFront(int value) {
if(isFull()) return false;
front = (front + sz -1) % sz;
q[front] = value;
n++;
return true;
}
bool insertLast(int value) {
if(isFull()) return false;
q[last] = value;
last = (last + 1) % sz;
n++;
return true;
}
bool deleteFront() {
if(isEmpty()) return false;
front = (front + 1) % sz;
n--;
return true;
}
bool deleteLast() {
if(isEmpty()) return false;
last = (last + sz - 1) % sz;
n--;
return true;
}
int getFront() {
if(isEmpty()) return -1;
return q[(front + sz) % sz ];
}
int getRear() {
if(isEmpty()) return -1;
return q[(last + sz -1) % sz ];
}
bool isEmpty() {
return n == 0;
}
bool isFull() {
return n == sz;
}
};
/**
* Your MyCircularDeque object will be instantiated and called as such:
* MyCircularDeque* obj = new MyCircularDeque(k);
* bool param_1 = obj->insertFront(value);
* bool param_2 = obj->insertLast(value);
* bool param_3 = obj->deleteFront();
* bool param_4 = obj->deleteLast();
* int param_5 = obj->getFront();
* int param_6 = obj->getRear();
* bool param_7 = obj->isEmpty();
* bool param_8 = obj->isFull();
*/