import java.util.*;
class MaxQueue {
private Queue<Integer> queue;
private LinkedList<Integer> max;
public MaxQueue() {
queue = new LinkedList<>();
max = new LinkedList<>();
}
public int max_value() {
return max.isEmpty() ? -1 : max.getFirst();
}
public void push_back(int value) {
queue.add(value);
while(max.size() != 0 && max.getLast() < value)
max.removeLast();
max.add(value);
}
public int pop_front() {
while(max.size() != 0 && max.getFirst().equals(queue.peek()))
max.removeFirst();
return queue.isEmpty() ? -1 : queue.poll();
}
}
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue obj = new MaxQueue();
* int param_1 = obj.max_value();
* obj.push_back(value);
* int param_3 = obj.pop_front();
*/
本题注意使用的是双向链表,对于每次插入元素时,会把max双向链表中所有比value值小的利用removeLast()方法删除,最后插入value。
出队列的时候只有在队首元素等于max元素时,max双向链表才考虑出队列。