題目描述:
題目: 設計一個支持 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而不是==,否則出錯。