📅  最后修改于: 2023-12-03 15:12:46.446000             🧑  作者: Mango
本题需要实现一个 Queue
类,支持以下操作:
Queue()
: 构造函数,初始化队列;void push(int x)
: 将整数 x 推入队列尾部;void pop()
: 从队列头部弹出一个元素;int peek()
: 返回队列头部的元素;bool empty()
: 返回队列是否为空。所有操作时间复杂度均为 O(1)。
可以使用一个数组和两个指针 head 和 tail 来实现。
class Queue {
private int capacity;
private int[] data;
private int head, tail;
public Queue(int capacity) {
this.capacity = capacity + 1;
this.data = new int[this.capacity];
this.head = 0;
this.tail = 0;
}
public void push(int x) {
if (this.isFull())
return;
this.data[tail] = x;
this.tail = (this.tail + 1) % this.capacity;
}
public void pop() {
if (this.isEmpty())
return;
this.head = (this.head + 1) % this.capacity;
}
public int peek() {
if (this.isEmpty())
return -1;
return this.data[head];
}
public boolean empty() {
return this.head == this.tail;
}
private boolean isFull() {
return (this.tail + 1) % this.capacity == this.head;
}
}
该队列的空间复杂度为 O(N),其中 N 为队列的容量。
注意到该队列的容量实际上是比用户输入的容量加 1 后得到的,这是为了避免在队列满的时候无法插入元素。
由于队列操作的复杂度均为 O(1),所以该队列的时间复杂度为 O(1)。
因此,该队列可以在时间和空间两方面都有比较好的表现。