设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。
可以看动画演示
https://leetcode-cn.com/explore/learn/card/queue-stack/216/queue-first-in-first-out-data-structure/864/
代码如下:
class MyCircularQueue {
private:
vector<int> data;//用来存储数据
int head;
int tail;
int size;
public:
/** Initialize your data structure here. Set the size of the queue to be k. */
MyCircularQueue(int k)
{
data.resize(k);
head=-1;//从-1开始
tail=-1;
size=k;//容器大小
}
/** Insert an element into the circular queue. Return true if the operation is successful. */
bool enQueue(int value)
{
if(isFull())//容器已经满了
{
return false;
}
if(head==-1)//head还在-1位置
{
head=0;
}
tail=(tail+1)%size;
data[tail]=value;
return true;
}
/** Delete an element from the circular queue. Return true if the operation is successful. */
bool deQueue()
{
if(isEmpty())//队列为空
{
return false;
}
if(head==tail)//两个指针已经指向同一个位置
{
head=-1;
tail=-1;
return true;
}
head=(head+1)%size;
return true;
}
/** Get the front item from the queue. */
int Front()
{
if(isEmpty())
{
return -1;
}
return data[head];
}
/** Get the last item from the queue. */
int Rear()
{
if(isEmpty())
{
return -1;
}
return data[tail];
}
/** Checks whether the circular queue is empty or not. */
bool isEmpty()
{
return head==-1;//只有head处于-1时是空队列
}
/** Checks whether the circular queue is full or not. */
bool isFull() {
return ((tail+1)%size)==head;//满状态
}
};