要求能在O(1)时间内取最大元素,并且放元素和取元素的时间复杂度尽量是O(1),之前有两个题是这个题的基础:
1、实现MaxStack(或者MinStack)。实现MaxStack比较简单,因为栈的操作都是在一端进行的。
2、用栈来实现队列。
这个题就是上述两个题的综合应用。首先要实现一个MaxStack,然后再用两个MaxStack来实现一个队列,两个MaxStack中的最大值就是队列中的最大值。
首先实现MaxStack:
import java.util.EmptyStackException;
import java.util.Stack;
/**
* 鉴于实现MaxQueue需要MaxStack的支持,还是先实现一个MaxStack吧
* @author qianlizhixingshiyuzuxia
* @version 创建时间:2016年8月18日 下午11:11:11
*/
public class MaxStack {
private Stack<Integer> commonStack = new Stack<Integer>();
private Stack<Integer> maxStack = new Stack<Integer>();
//MaxStack的push操作
public MaxStack push(Integer x){
commonStack.push(x);
if(maxStack.isEmpty()){
maxStack.push(x);
}else{
if(maxStack.peek()<x){
maxStack.push(x);
}else{
maxStack.push(maxStack.peek());
}
}
return this;
}
public int pop(){
if(commonStack.isEmpty()){
throw new EmptyStackException();
}
maxStack.pop();
return commonStack.pop();
}
public int maxElement(){
if(commonStack.isEmpty()){
//throw new EmptyStackException();
return -1;
}
return maxStack.peek();
}
public boolean isEmpty(){
return commonStack.isEmpty();
}
//测试
public static void main(String[] args) {
MaxStack maxStack = new MaxStack();
maxStack.push(2).push(1).push(3).push(4).push(3).push(2);
System.out.println(maxStack);
}
@Override
public String toString() {
return "MaxStack [commonStack=" + commonStack + ", maxStack="
+ maxStack + "]";
}
}
然后用两个MaxStack实现MaxQueue:
/**
* MaxQueue是指能在O(1)时间内取出最大值的queue,我们已经做过minStack或者maxStack。
* 因为使用Stack保存最大值比较方便嘛,这里就用两个栈来实现一个队列,然后求最大值的时候
* 就用返回这两个栈中的最大值
* @author qianlizhixingshiyuzuxia
* @version 创建时间:2016年8月18日 下午11:07:02
*/
public class MaxQueue {
//第一个栈用于入队列,第二个栈用于出队列
MaxStack s1 = new MaxStack();
MaxStack s2 = new MaxStack();
public MaxQueue enQueue(int x){
s1.push(x);
System.out.println(this.maxElement());
return this;
}
public int deQueue(){
System.out.println(this.maxElement());
if(!s2.isEmpty()){
return s2.pop();
}
while(!s1.isEmpty()){
s2.push(s1.pop());
}
return s2.pop();
}
public int maxElement(){
return Math.max(s1.maxElement(), s2.maxElement());
}
public static void main(String[] args) {
MaxQueue maxQueue = new MaxQueue();
maxQueue.enQueue(2).enQueue(3).enQueue(4).enQueue(1).enQueue(2);
System.out.println("-------");
maxQueue.deQueue();
maxQueue.deQueue();
maxQueue.deQueue();
maxQueue.deQueue();
maxQueue.deQueue();
}
}