本文參考自《劍指offer》一書,代碼采用Java語言。
題目
定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。在該棧中,調用min、push及pop的時間復雜度都是O(1)。
思路
最初想法是定義一個成員變量min來存放最小元素,但是當最小元素彈出后,min就需要相應改變,所以必須把每次的最小值都存儲下來。考慮采用一個輔助棧來存放最小值:
棧 3,4,2,5,1
輔助棧 3, 3,2,2,1
(壓入時,把每次的最小元素(之前最小元素與新入棧元素的較小值)保存起來放到輔助棧中)
測試算例
1.新壓入數字更大
2.新壓入數字最小
3.彈出數字最小
4.彈出數字不是最小
Java代碼
//題目:定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min
//函數。在該棧中,調用min、push及pop的時間復雜度都是O(1)。
public class StackWithMin {
Stack<Integer> stack_data=new Stack<Integer>();
Stack<Integer> stack_min=new Stack<Integer>();
public void push(int node) {
stack_data.push(node);
if(stack_min.empty() || stack_min.peek()>node) {
stack_min.push(node);
}else {
stack_min.push(stack_min.peek());
}
}
public void pop() {
if(!stack_data.empty()) {
stack_data.pop();
stack_min.pop();
}
}
public int min() {
return stack_min.peek();
}
}
收獲
要學會這種情況下輔助棧的用法。
