1. 程式人生 > >LintCode:12. 帶最小值操作的棧

LintCode:12. 帶最小值操作的棧

問題描述:
實現一個帶有取最小值min方法的棧,min方法將返回當前棧中的最小值。

你實現的棧將支援push,pop 和 min 操作,所有操作要求都在O(1)時間內完成。

樣例
如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1

注意事項
如果堆疊中沒有數字則不能進行min方法的呼叫

在這個問題中,我使用的語言是java語言(其他語言忘光了寫了估計都編譯不了。。。),首先我們需要棧,恰好Java為我們提供了現成的棧Stack:
Java中色Stack繼承的是Vector(應該很多人不知道的吧 我也是上網翻資料找出來的)下面就介紹它的基本API

  • 進棧
E push(E item) 
將專案推送到此堆疊的頂部。 
  • 出棧
E pop() 
刪除此堆疊頂部的物件,並將該物件作為此函式的值返回。  
  • 判空
boolean empty() 
測試此堆疊是否為空。 
  • 取值而不出棧(正好取最小值用到)
E peek() 
檢視此堆疊頂部的物件,而不從堆疊中刪除它。 

在程式碼實現中我們需要準備兩個棧,一個正常進行壓棧彈棧操作,另一個用來儲存最小值,每次壓棧前都與儲存最小值的棧頂元素比較,確保最小值始終在棧頂。
下面貼出程式碼:(比較了一下,好像效率並不是很高介意勿看)

public class MinStack {
    //定義棧
    public Stack<Integer> stack;
    public Stack<Integer> min;
    public MinStack() {
            stack=new Stack();
            min=new Stack();
    }

    /*
     * @param number: An integer
     * @return: nothing
     */
    public void push(int number) {
        if(min.empty()||number<=min.peek()){
            min.push(number);
        }
        stack.push(number);
    }

    /*
     * @return: An integer
     */
    public int pop() {
        // write your code here
        int topstack=stack.pop();
        if(topstack==min.peek()){
            min.pop();
        }
        return topstack;

    }

    /*
     * @return: An integer
     */
    public int min() {
        // write your code here
        return min.peek();
    }
}