结合之前实现的 maxStack 和 用两个stack 实现一个Queue, 实现 MaxQueue
import java.util.Stack;
public class MaxQueue {
MaxStack in = new MaxStack();
MaxStack out = new MaxStack();
public void enqueue(Integer a) {
in.push(a);
}
public Integer dequeue() {
shiftItems();
return out.pop();
}
public Integer peek() {
shiftItems();
return out.peek();
}
public Integer max() {
return Math.max(in.isEmpty() ? Integer.MIN_VALUE : in.max(), out.isEmpty() ? Integer.MIN_VALUE : out.max());
}
private void shiftItems() {
if (!out.isEmpty())
return;
while (!in.isEmpty()) {
out.push(in.pop());
}
}
public static void main(String[] args) {
MaxQueue queue = new MaxQueue();
queue.enqueue(1);
System.out.println(queue.max());
queue.enqueue(2);
System.out.println(queue.max());
queue.enqueue(3);
System.out.println(queue.max());
queue.enqueue(4);
System.out.println(queue.max());
queue.dequeue();
System.out.println(queue.max());
queue.dequeue();
System.out.println(queue.max());
queue.dequeue();
System.out.println(queue.max());
}
}
class MaxStack {
Stack<Integer> val = new Stack<Integer>();
Stack<Integer> max = new Stack<Integer>();
public boolean isEmpty() {
return val.isEmpty();
}
public void push(Integer a) {
val.push(a);
if (max.isEmpty() || a >= max.peek())
max.push(a);
}
public Integer pop() {
Integer out = val.pop();
if (out == max.peek())
max.pop();
return out;
}
public Integer peek() {
return val.peek();
}
public Integer max() {
return max.peek();
}
}