劍指Offer之最小棧

題目描述:

題目: 設計一個支持 push ,pop ,top 操作,並能在常數時間內檢索到最小元素的棧。
要求:
push(x) —— 將元素 x 推入棧中。
pop() —— 刪除棧頂的元素。
top() —— 獲取棧頂元素。
getMin() —— 檢索棧中的最小元素。

思路分析:

題目的關鍵是可以得到棧中的最小值,我們可以用一個輔助棧minStack來解決問題:

  • 當元素進棧時,若輔助棧爲null或者進棧元素小於等於輔助棧的棧頂元素,元素進棧的同時,也進輔助棧;
  • 當元素出棧時,若出棧元素和輔助棧棧頂元素相等,輔助棧的棧頂元素也出棧;

參考代碼:

class MinStack {
  private Stack<Integer> stack;
  private Stack<Integer> minStack;
  
  public MinStack(){
    stack = new Stack<>();
    minStack = new Stack<>();
  }
  
  public void push(int x) {
    stack.push(x);
    if(minStack.isEmpty() || x <= minStack.peek())minStack.push(x);
  }
  
  public void pop() {
     if(stack.pop().equals(minStack.peek()))minStack.pop();  
  }

  public int top() {
     return stack.peek();
  }

  public int getMin() {
     return minStack.peek();
  }
}

小結:

  • 當進棧元素等於輔助棧的棧頂元素時,進棧元素也進輔助棧;
  • 當進棧元素大於輔助棧的棧頂元素時,進棧元素不進輔助棧;
  • 棧頂元素和輔助棧元素比較的時候,注意用equals而不是==,否則出錯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章