设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
- MyCircularQueue(k): 构造器,设置队列长度为 k 。
- Front: 从队首获取元素。如果队列为空,返回 -1 。
- Rear: 获取队尾元素。如果队列为空,返回 -1 。
- enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
- deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
- isEmpty(): 检查循环队列是否为空。
- isFull(): 检查循环队列是否已满。
示例:
MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1); // 返回 true
circularQueue.enQueue(2); // 返回 true
circularQueue.enQueue(3); // 返回 true
circularQueue.enQueue(4); // 返回 false,队列已满
circularQueue.Rear(); // 返回 3
circularQueue.isFull(); // 返回 true
circularQueue.deQueue(); // 返回 true
circularQueue.enQueue(4); // 返回 true
circularQueue.Rear(); // 返回 4
提示:
- 所有的值都在 0 至 1000 的范围内;
- 操作数将在 1 至 1000 的范围内;
- 请不要使用内置的队列库。
class MyCircularQueue {
private int[] queue; // 用于存放队列元素的数组
private int front, rear; // 队列的前端和后端指针
public MyCircularQueue(int k) {
queue = new int[k + 1]; // 初始化队列数组,长度为k+1,留一个空位用于判断队列是否已满
front = 0; // 初始化队列的前端指针为0
rear = 0; // 初始化队列的后端指针为0
}
public boolean enQueue(int value) {
if (isFull()) { // 如果队列已满,无法入队
return false;
} else {
queue[rear] = value; // 将元素放入队列的后端位置
rear = (rear + 1) % queue.length; // 更新后端指针,考虑循环队列的情况
return true; // 入队成功
}
}
public boolean deQueue() {
if (isEmpty()) { // 如果队列为空,无法出队
return false;
} else {
front = (front + 1) % queue.length; // 更新前端指针,使其指向下一个元素
return true; // 出队成功
}
}
public int Front() {
if (isEmpty()) // 如果队列为空,返回-1
return -1;
return queue[front]; // 返回队列的前端元素
}
public int Rear() {
if (isEmpty()) // 如果队列为空,返回-1
return -1;
return queue[(rear - 1 + queue.length) % queue.length]; // 返回队列的后端元素
}
public boolean isEmpty() {
return front == rear; // 如果前端指针和后端指针相等,说明队列为空
}
public boolean isFull() {
return (rear + 1) % queue.length == front; // 如果下一个后端位置的索引等于前端位置的索引,说明队列已满
}
}
详细说明:
MyCircularQueue
类是循环队列的实现,它有以下成员变量:queue
:用于存放队列元素的数组。front
:队列的前端指针。rear
:队列的后端指针。
MyCircularQueue(int k)
构造函数用于初始化循环队列,接受一个整数k
,表示队列的最大容量。enQueue(int value)
方法用于向循环队列中插入一个元素,接受一个整数value
,表示要插入的元素值。deQueue()
方法用于从循环队列中删除一个元素。Front()
方法用于获取队列的前端元素值。Rear()
方法用于获取队列的后端元素值。isEmpty()
方法用于判断循环队列是否为空。isFull()
方法用于判断循环队列是否已满。