实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返 回栈中最小元素的操作。 【要求】 1.pop、push、getMin操作的时间复杂度都是O(1)。 2.设计的栈类型可以使用现成的栈结构。
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MinStack s = new MinStack();
s.push(5);
System.out.println(s);
System.out.println(s.getMin());
s.push(4);
System.out.println(s);
System.out.println(s.getMin());
s.push(3);
System.out.println(s);
System.out.println(s.getMin());
s.push(3);
System.out.println(s);
System.out.println(s.getMin());
s.pop();
System.out.println(s);
System.out.println(s.getMin());
s.pop();
System.out.println(s);
System.out.println(s.getMin());
s.pop();
System.out.println(s);
System.out.println(s.getMin());
}
}
class MinStack{
//用一个栈存放动态的最小值
Stack<Integer> stackData ;
Stack<Integer> stackmin ;
public MinStack(){
stackData = new Stack<Integer>();
stackmin = new Stack<Integer>();
}
public void push(Integer a){
if(this.stackmin.isEmpty()){//当最小值栈为空时,第一个默认为最小值
this.stackmin.push(a);
}else if(this.stackmin.peek()>=a){//当进来的元素小于或者等于最小值栈栈顶元素时入栈
this.stackmin.push(a);
}
this.stackData.push(a);
}
public int pop(){
if(this.stackmin.peek()==this.stackData.peek()){//当弹出的元素等于最小值
this.stackmin.pop();
}
return this.stackData.pop();
}
public int getMin(){
if (this.stackmin.isEmpty()) {
throw new RuntimeException("Your stack is empty.");
}
return this.stackmin.peek();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return stackData.toString();
}
}