📅  最后修改于: 2023-12-03 15:12:36.023000             🧑  作者: Mango
这是2011年计算机科学门考试中的第21个问题。本题目涉及到了数据结构和编程语言。
构造一个队列数据结构,要求能够在 $O(1)$ 时间复杂度内执行以下操作:
Enqueue(x)
:将元素 $x$ 插入到队列的尾部。Dequeue()
:将队列首部的元素弹出,并返回该元素。Max()
:返回队列中最大的元素。考虑使用一个双向队列 data 来存储元素,并维护一个双向队列 maximums,用于存储当前 data 中的最大值。
Enqueue
操作:
Dequeue
操作:
Max
操作:
Java 代码实现如下:
import java.util.Deque;
import java.util.LinkedList;
public class QueueWithMax {
private Deque<Integer> data;
private Deque<Integer> maximums;
public QueueWithMax() {
data = new LinkedList<>();
maximums = new LinkedList<>();
}
public void Enqueue(int x) {
data.addLast(x);
while (!maximums.isEmpty() && maximums.getLast() < x) {
maximums.removeLast();
}
maximums.addLast(x);
}
public int Dequeue() {
if (data.isEmpty()) {
throw new RuntimeException("no element in queue");
}
int x = data.removeFirst();
if (x == maximums.getFirst()) {
maximums.removeFirst();
}
return x;
}
public int Max() {
if (maximums.isEmpty()) {
throw new RuntimeException("no element in queue");
}
return maximums.getFirst();
}
}
其中,Deque
是 Java 中提供的双向队列,由 LinkedList
实现。注意比较时要使用 removeFirst()
或 getLast()
方法,而不是 pop()
或 remove()
方法。
QueueWithMax q = new QueueWithMax();
q.Enqueue(1);
q.Enqueue(3);
q.Enqueue(2);
System.out.println(q.Max()); // should return 3
q.Dequeue();
System.out.println(q.Max()); // should return 3
q.Dequeue();
System.out.println(q.Max()); // should return 2