题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。
思路:
如果只用一个元素保存最小的元素,那么当最小的元素被弹出后,就没有办法得到剩余元素中最下的元素。
所以,最好的办法是将每次的最小元素(之前的最小元素和新压入的元素两者的较小者)都保存起来放到另外一个辅助栈里。
这是剑指offer书中的举例一个模拟过程:
代码:
import java.util.Stack;
public class StackWithMinTest {
private static Stack<Integer> mStack = new Stack<Integer>();
private static Stack<Integer> minStack = new Stack<Integer>();
public static void push(Integer i){
mStack.push(i);
if(minStack.size() == 0 || i < minStack.peek()){
minStack.push(i);
}else{
minStack.push(minStack.peek());
}
}
public static void pop(){
assert(mStack.size() > 0 && minStack.size() > 0);
minStack.pop();
mStack.pop();
}
public static Integer min(){
assert(mStack.size() > 0 && minStack.size() > 0);
return minStack.peek();
}
public static void main(String[] args) {
push(3);
System.out.println(min());
push(4);
System.out.println(min());
push(2);
System.out.println(min());
push(1);
System.out.println(min());
pop();
System.out.println(min());
pop();
System.out.println(min());
push(0);
System.out.println(min());
}
}