622. Design Circular Queue #
题目 #
设计循环队列。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k)
: 构造器,设置队列长度为 k 。Front
: 从队首获取元素。如果队列为空,返回 -1 。Rear
: 获取队尾元素。如果队列为空,返回 -1 。enQueue(value)
: 向循环队列插入一个元素。如果成功插入则返回真。deQueue()
: 从循环队列中删除一个元素。如果成功删除则返回真。isEmpty()
: 检查循环队列是否为空。isFull()
: 检查循环队列是否已满。
思路 #
基于链表的实现较为简单,而基于数组的实现相对复杂。
代码 #
class MyCircularQueue {
private class ListNode {
int val;
ListNode prev;
ListNode next;
ListNode (int val, ListNode prev, ListNode next) {
this.val = val;
this.prev = prev;
this.next = next;
}
}
private int size;
private int capacity;
ListNode sentinel;
public MyCircularQueue(int k) {
this.capacity = k;
this.size = 0;
this.sentinel = new ListNode(-1, null, null);
this.sentinel.prev = this.sentinel.next = this.sentinel;
}
public boolean enQueue(int value) {
if (isFull() == true) return false;
this.sentinel.prev = new ListNode(value, this.sentinel.prev, this.sentinel);
this.sentinel.prev.prev.next = this.sentinel.prev;
this.size += 1;
return true;
}
public boolean deQueue() {
if (isEmpty() == true) return false;
this.sentinel.next = this.sentinel.next.next;
this.sentinel.next.prev = this.sentinel;
this.size -= 1;
return true;
}
public int Front() {
if (isEmpty() == true) return -1;
else return this.sentinel.next.val;
}
public int Rear() {
if (isEmpty() == true) return -1;
else return this.sentinel.prev.val;
}
public boolean isEmpty() {
return this.size == 0;
}
public boolean isFull() {
return this.size == capacity;
}
}