LintCode:12. 帶最小值操作的棧
阿新 • • 發佈:2018-12-02
問題描述:
實現一個帶有取最小值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(); } }