输入:一个整数 k,表示队列的最大容量。
要求:设计实现循环队列类 MyCircularQueue。循环队列实际上是存储在一个固定大小的数组中,并被当作首尾相接的环形结构。你需要实现以下方法:
-
MyCircularQueue(k):构造器,设置队列长度为 k。
-
enQueue(value):向循环队列插入一个元素。如果成功插入返回
true。 -
deQueue():从循环队列中删除一个元素。如果成功删除返回
true。 -
Front():从队列中获取队首元素。如果队列为空,返回 -1。
-
Rear():获取队尾元素。如果队列为空,返回 -1。
-
isEmpty():检查循环队列是否为空。
-
isFull():检查循环队列是否已满。
输出:实现一个符合上述要求的循环队列类。
思路:使用一个定长数组,通过取模运算模拟环形结构。写的很随意,可以简化变量,但是话又说回来了,能用就行(bushi
复杂度:
时间复杂度:O(1)
空间复杂度:O(k)
class MyCircularQueue {
private:
vector<int> tmp;
int maxLen;
int len;
int front;
int rear;
public:
MyCircularQueue(int k) {
maxLen = k;
tmp.resize(k);
len = 0;
rear = 0;
front = 0;
}
bool enQueue(int value) {
if (len == maxLen) {
return false;
}
tmp[rear] = value;
rear++;
rear = rear % maxLen;
len++;
return true;
}
bool deQueue() {
if (len == 0) {
return false;
}
front++;
front = front % maxLen;
len--;
return true;
}
int Front() {
if (len == 0) {
return -1;
}
return tmp[front];
}
int Rear() {
if (len == 0) {
return -1;
}
return tmp[(rear + maxLen - 1) % maxLen];
}
bool isEmpty() {
return len == 0;
}
bool isFull() {
return len == maxLen;
}
};
/**
* 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();
*/
761

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



