总体思想是以空间来换时间,设置两个栈,其中一个栈放元素,一个栈放最小的值,在push时,判断新push进去的元素和原先栈中的元素哪个小,小的才有资格入栈;在pop元素时候,要记得将存放最小值的栈的栈顶元素也pop出来。很简单。栈的实现用链表的实现方式。
/*
* 用O(1)的时间复杂度求栈中的最小元素
*/
public class MyStack1 {
LinkedStack<Integer>elem;
LinkedStack<Integer>min;
public MyStack1(){
elem=new LinkedStack<Integer>();
min=new LinkedStack<Integer>();
}
public void push(int data){
elem.push(data);
if(min.isEmpty()){
min.push(data);
}else{
if(data<min.peek()){
min.push(data);
}
}
}
public int pop(){
int topdata=elem.peek();
elem.pop();
if(topdata==min.peek()){
min.pop();
}
return topdata;
}
public int min(){
if(min.isEmpty()){
return Integer.MAX_VALUE;
}
return min.peek();
}
public static void main(String[] args){
MyStack1 newstack=new MyStack1();
newstack.push(1);
newstack.push(2);
newstack.push(3);
newstack.pop();
System.out.print(newstack.min());//print 1
}
}