栈和队列之设计一个有getMin(得到最小值)功能的栈

有2中方案,分别用类和内部类实现了


import java.util.Stack;

/**
 * @author chenyu  第一种设计:
 *  题目:设计一个有getMin功能的栈,设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
 *  要求:1 pop push getMin操作的时间复杂度都是O(1)
 *              2 设计的栈类型可以使用线程的栈结构
 *   思路:压入数据规则:假设当前数据时value,先将其压入stackData,然后判断stackMin是否为空,
 *               如果为空,则value压入stackMin
 *               如果不能空,则比较value和stackMin中栈顶元素的哪一个更小
 *               如果value更小或者两者相等,则将value也压入stackMin
 *               如果value中栈顶元素小,则stackMin不压入任何内容,如下例子
 *               1-------->1
 *               2------->无
 *               1-------->1
 *               5-------->无
 *               4-------->无
 *               3-------->3
 *               弹出数据规则:由压入数据规则可知,栈顶元素是最小的,先弹出stackData栈顶元素value,当value等于stackMin栈顶元素的时候,stackMin弹出数据
 *               当value大于stackMin栈顶元素的时候,不弹出,返回value.
 *               查询当前最小操作:由压入数据和弹出数据可知,栈顶元素,始终是stackData中的最小值,代码如下
 */
public class GetMinStack {
     private Stack<Integer> statckData;
     private Stack<Integer> stackMin;
     public GetMinStack(){
    	 statckData=new Stack<Integer>();
    	 stackMin=new Stack<Integer>();
     }
     //压入数据
     public void push(int value){
    	 if(this.stackMin.isEmpty()){
    		  this.stackMin.push(value);
    	 }else if(value<=this.getMin()){
    		  this.stackMin.push(value);
    	 }
    	 this.statckData.push(value);
     }
     //弹出数据
     public int pop(){
    	 if(this.stackMin.isEmpty()){
    		 throw new RuntimeException("Your stack is empty");
    	 }
    	 int value=this.statckData.pop();
    	 if(value==this.getMin()){
    		 this.stackMin.pop();
    	 }
    	 return value;
     }
     //得到最小值
     public int getMin(){
    	 if(stackMin.isEmpty()){
    		 throw new RuntimeException("Your stack is empty");
    	 }
    	 return this.stackMin.peek();
      }
     /**
      * 第二种设计,压入的时候和前面一种不同的方式是,如果压入的数据比栈顶元素大,
      * 我们依然压入栈顶元素,如下图
      *     1------>1
      *     2------>1
      *     1------>1
      *     5------>3
      *     4------>3
      *     3------>3
      */
     public class GetMinStack2{
    	 private Stack<Integer> statckData;
         private Stack<Integer> stackMin;
         public GetMinStack2(){
        	 statckData=new Stack<Integer>();
        	 stackMin=new Stack<Integer>();
         } 
       //压入数据
         public void push(int value){
        	 if(this.stackMin.isEmpty()){
        		  this.stackMin.push(value);
        	 }else if(value<=this.getMin()){
        		  this.stackMin.push(value);
        	 }else{
        		 int value1=getMin();
        		 this.stackMin.push(value1);
        	 }
        	 this.statckData.push(value);
         }
       //弹出数据
         public int pop(){
        	 if(this.stackMin.isEmpty()){
        		 throw new RuntimeException("Your stack is empty");
        	 }
        		 this.stackMin.pop();
        		 return this.statckData.pop();
         }
         //得到最小值
         public int getMin(){
        	 if(stackMin.isEmpty()){
        		 throw new RuntimeException("Your stack is empty");
        	 }
        	 return this.stackMin.peek();
          }
     }
}


你可能感兴趣的:(栈和队列)