Implement the MyCircularDeque class:
MyCircularDeque(int k) Initializes the deque with a maximum size of k.
boolean insertFront() Adds an item at the front of Deque. Returns true if the operation is successful, or false otherwise.
boolean insertLast() Adds an item at the rear of Deque. Returns true if the operation is successful, or false otherwise.
boolean deleteFront() Deletes an item from the front of Deque. Returns true if the operation is successful, or false otherwise.
boolean deleteLast() Deletes an item from the rear of Deque. Returns true if the operation is successful, or false otherwise.
int getFront() Returns the front item from the Deque. Returns -1 if the deque is empty.
int getRear() Returns the last item from Deque. Returns -1 if the deque is empty.
boolean isEmpty() Returns true if the deque is empty, or false otherwise.
boolean isFull() Returns true if the deque is full, or false otherwise.
Example 1:
Input
[“MyCircularDeque”, “insertLast”, “insertLast”, “insertFront”, “insertFront”, “getRear”, “isFull”, “deleteLast”, “insertFront”, “getFront”]
[[3], [1], [2], [3], [4], [], [], [], [4], []]
Output
[null, true, true, true, false, 2, true, true, true, 4]
Explanation
MyCircularDeque myCircularDeque = new MyCircularDeque(3);
myCircularDeque.insertLast(1); // return True
myCircularDeque.insertLast(2); // return True
myCircularDeque.insertFront(3); // return True
myCircularDeque.insertFront(4); // return False, the queue is full.
myCircularDeque.getRear(); // return 2
myCircularDeque.isFull(); // return True
myCircularDeque.deleteLast(); // return True
myCircularDeque.insertFront(4); // return True
myCircularDeque.getFront(); // return 4
Constraints:
1 <= k <= 1000
0 <= value <= 1000
At most 2000 calls will be made to insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull.
解法1:用vector或数组
注意front和rear一开始都是-1,当进行第一次insertFront()或insertRear()之后,它们的值要变成0。否则后面的getRear()或getFront()会出错。
class MyCircularDeque {
public:
MyCircularDeque(int k) {
data.resize(k, 0);
capacity = k;
count = 0;
front = -1;
rear = -1;
}
bool insertFront(int value) {
if (count >= capacity) return false;
if (front == -1 && rear == -1) { //the first insert
front = rear = 0;
} else {
front = (front - 1 + capacity) % capacity;
}
data[front] = value;
count++;
return true;
}
bool insertLast(int value) {
if (count >= capacity) return false;
if (front == -1 && rear == -1) { //the first insert
front = rear = 0;
} else {
rear = (rear + 1) % capacity;
}
data[rear] = value;
count++;
return true;
}
bool deleteFront() {
if (count > 0) {
front = (front + 1) % capacity;
count--;
return true;
}
return false;
}
bool deleteLast() {
if (count > 0) {
rear = (rear - 1 + capacity) % capacity;
count--;
return true;
}
return false;
}
int getFront() {
if (count == 0) return -1;
return data[front];
}
int getRear() {
if (count == 0) return -1;
return data[rear];
}
bool isEmpty() {
return count == 0;
}
bool isFull() {
return count == capacity;
}
private:
vector<int> data;
int capacity, count, front, rear;
};
/**
* 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();
*/