输入:一个整数 k,表示双端队列的最大容量。
要求:设计你的实现循环双端队列类 MyCircularDeque。它是一种能从两端分别插入和删除元素的双向队列,使用固定大小的数组模拟环形结构。你需要实现题目要求的所有操作方法。
输出:实现一个符合上述要求的循环双端队列类。
思路:基于定长数组并通过取模运算模拟环形结构,在 LC.622题 设计循环队列 的基础上新增一下出队入队函数即可。
复杂度:
时间复杂度:O(1)
空间复杂度:O(k)
class MyCircularDeque {
private:
vector<int> tmp;
int maxLen;
int len;
int front;
int rear;
public:
MyCircularDeque(int k) {
tmp.resize(k);
maxLen = k;
len = 0;
front = 0;
rear = 0;
}
bool insertFront(int value) {
if (len == maxLen) {
return false;
}
front--;
front = (front + maxLen) % maxLen;
tmp[front] = value;
len++;
return true;
}
bool insertLast(int value) {
if (len == maxLen) {
return false;
}
tmp[rear] = value;
rear++;
rear = rear % maxLen;
len++;
return true;
}
bool deleteFront() {
if (len == 0) {
return false;
}
front++;
front = front % maxLen;
len--;
return true;
}
bool deleteLast() {
if (len == 0) {
return false;
}
rear--;
rear = (rear + maxLen) % maxLen;
len--;
return true;
}
int getFront() {
if (len == 0) {
return -1;
}
return tmp[front];
}
int getRear() {
if (len == 0) {
return -1;
}
return tmp[(rear + maxLen - 1) % maxLen];
}
bool isEmpty() {
return len == 0;
}
bool isFull() {
return len == maxLen;
}
};
/**
* 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();
*/
1071

被折叠的 条评论
为什么被折叠?



