-
问题描述
实现一个栈,该栈除了可以实现栈应有的功能外,可以弹出最小值,且时间复杂度为O(1)。 -
解决方案
利用两个栈来实现,其中一个栈存储数据,另一个栈存储最小值,操作时同时维护两个栈即可。代码如下: -
改进:
存储最小值的栈,可以只存储递减序列,弹出时只有数据栈的栈顶值和最小值的栈顶值相同时才弹出。
/**
* 在实现栈的基本功能的基础上,实现弹出最小值的操作,要求时间复杂度为O(1)
*/
public class getMinStack<E extends Comparable<E>> {
private Stack<E> stack;
private Stack<E> minStack;
public getMinStack(){
stack = new Stack<E>();
minStack = new Stack<E>();
}
public void push(E e){
stack.push(e);
if(minStack.isEmpty() || e.compareTo(minStack.peek()) < 0)
minStack.push(e);
else minStack.push(minStack.peek());
}
public E pop(){
if(stack.isEmpty())
throw new RuntimeException("stack is empty");
E ret = stack.pop();
minStack.pop();
return ret;
}
public E getMin(){
if(minStack.isEmpty())
throw new RuntimeException("stack is empty");
return minStack.peek();
}
}