题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小素的min 函数。在该栈中,调用min、push 及pop的时间复杂度都是0(1)。
题目分析:借助一个辅助栈,当向栈中压入元素时,跟辅助栈顶元素作比较,把最小的放到辅助栈中。每次都把最小元素放入辅助栈,这样在弹出最小元素后,剩下的栈中栈顶依然是最小元素。
public static class StackMin<T extends Comparable<T>> {
private Stack<T> dateStack;
private Stack<T> minStack;
public StackMin () {
dateStack = new Stack<>();
minStack = new Stack<>();
}
public T pop () {
if (dateStack.isEmpty()) {
throw new RuntimeException("stack is empty" );
}
if (dateStack.peek() == minStack.peek()) {
minStack.pop();
return dateStack.pop();
} else {
return dateStack.pop();
}
}
public void push (T t) {
if (dateStack.isEmpty()) {
dateStack.push(t);
minStack.push(t);
} else {
T temp = minStack.peek();
if (t.compareTo(temp) < 0 ) {
minStack.push(t);
}
dateStack.push(t);
}
}
public T min (){
if (minStack.isEmpty()){
throw new RuntimeException("stack is empty" );
}
return minStack.peek();
}
}