1. 程式人生 > >設計一個堆疊,函式min、push 以及pop 的時間複雜度都是O(1)

設計一個堆疊,函式min、push 以及pop 的時間複雜度都是O(1)

/**
 * 2.設計包含min 函式的棧。
 *  定義棧的資料結構,要求新增一個min 函式,能夠得到棧的最小元素。
 *  要求函式min、push 以及pop 的時間複雜度都是O(1)。
 *  
 *  經典的空間換取時間,這個是利用java語言的JDK的實現的
 */
public class A02_1 {
	 public static void main(String[] args){
		    StackA stack = new StackA();
		    stack.push(1);
		    System.out.println(stack.min());
		    stack.push(3);stack.push(0);
		    System.out.println(stack.size());
		    System.out.println(stack.min());
		    stack.pop();
		    System.out.println(stack.min());
		}
		static class StackA extends Vector<Integer>{
		   
		    private static final long serialVersionUID = -2638250013215651059L;
		    //最小值的棧,用來儲存最小的值的下標
		    public Stack<Integer> minstack = new Stack<Integer>();
		   
		    /**
		    * 取的最小值
		    * */
		    public Integer min(){
		    	//最小值的下標,得到這個最小值
		        return super.get(minstack.peek());
		    }
		    public void push(Integer interger){
		        if(super.size() == 0){
		           minstack.push(0);
		        }else{
		        	
		           if(interger.compareTo(min())<= 0){
		        	 //如果壓棧的這個值比最小值小
		               minstack.push(super.size());
		           }else{
		        	 //如果壓棧的這個值比最小值大,還是原來的最小值對應的那個座標
		               minstack.push(minstack.peek());
		           }
		        }
		        super.add(interger);
		    }
		   
		    public Integer pop(){
		        if(0 == super.size())
		           throw new EmptyStackException();
		        Integer result = super.get(super.size()-1);
		        super.remove(super.size() - 1);
		        //與之相對應的最小值的出棧
		        minstack.pop();
		        return result;
		    }
		}

}
//第二種的方法,更加的清晰說明空間換取時間
public class A02_2 {
	
    public  static void main(String[] args){
    stack name = new stack();
    name.push(5);
    System.out.println(name.min());
    name.push(2);name.push(6);//5 2 6
     System.out.println(name.min());
    name.pop();//5 2
    System.out.println(name.min());
    name.push(1);name.push(1);name.push(0);//5 2 1 1 0
    System.out.println(name.min());
    name.pop();name.pop();//5 2 1
    System.out.println(name.min());
     name.pop();name.pop();//5
    System.out.println(name.min());    
    }
static class element{
	//當前元素的內容
    public int content;
    //其對用的最小值
    public int minvalue;
    public element(int value){
        content = value;
    }
}
static class stack{
    private static final int MAX = 10;
    element[] array =new element[MAX];
    int top = -1;
    public int pop(){
        if(top < 0){
           throw new Error("null array");
        }
        int result = array[top].content;
        array[top] = null;
        top--;
        return result;
    }
    public void push(int value){
        element temp = new element(value);
        if(top < 0){ 
           temp.minvalue = value;
        }else{
           if(value <= min()){
        	   //壓棧元素小於最小的元素
               temp.minvalue = value;
           }else{
               temp.minvalue = min();//
           }
        }
        top++;
        array[top] = temp;
    }
    public int min(){
        if(top < 0){
           throw new Error("null array");
        }
        return array[top].minvalue;
    }
}
}