最小棧的實現

       題目:
       實現一個棧,該棧帶有出棧,入棧,取最小元素3個方法,要保證3個方法的時間複雜度都是O(1);

       解題思路:
       1.設原有的棧叫做棧A,此時額外創建一個棧B,用於輔助棧A
       2.當第一個元素進入棧A時,讓新元素也進入棧B,這個唯一的元素就是棧A的當前最小值
       3.之後,每當新元素進入棧A時,比較新元素和棧A當前最小值的大小,如果小於棧A當前最小值,則讓新元素進入棧B,此時棧B的棧頂元素就是棧A當前最小值
       每當棧A有元素出棧時,如果出棧元素時站A當前最小值,則讓棧B的棧頂元素也出棧,此時棧B餘下的棧頂元素所指向的,是棧A當中原本第2 小的元素,代替剛纔的出棧元素稱爲棧A當前最小值
       5.當調用getMin方法的時候,返回棧B的棧頂所存儲的值,這也是棧A的最小值。

import java.util.Stack;

public class getMinStack {
    private Stack<Integer> mainStack = new Stack<Integer>();
    private Stack<Integer> minStack = new Stack<Integer>();
    //入棧
    public void push(int element){
        mainStack.push(element);
        //如果輔助站爲空,或則新元素小於或者等於輔助棧棧頂,則將新元素壓入棧
        if(minStack.empty() || element <= minStack.peek()){
            minStack.push(element);
        }
    }
    //出棧
    public Integer pop(){
        //如果出棧元素和輔助棧棧頂元素值相等,輔助棧出棧
        if(mainStack.peek().equals(minStack.peek())){
            minStack.pop();
        }
        return mainStack.pop();
    }
    //獲取最小元素
    public int getMin() throws Exception{
        if(mainStack.empty()){
            throw new Exception("stack is empty");
        }
        return minStack.peek();
    }

    public static void main(String[] args) throws Exception{
        getMinStack stack = new getMinStack();
        stack.push(4);
        stack.push(9);
        stack.push(7);
        stack.push(3);
        stack.push(8);
        System.out.println(stack.getMin());
        stack.pop();
        stack.pop();
        System.out.println(stack.getMin());
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章