【刷題筆記3】棧的最小值
阿新 • • 發佈:2021-02-19
題目
請設計一個棧,除了常規棧支援的pop與push函式以外,還支援min函式,該函式返回棧元素中的最小值。執行push、pop和min操作的時間複雜度必須為O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
思路
1.使用兩個系統提供的棧stack1,stack2
2.push操作時向statck1中壓入元素i,如果statck2的棧頂元素大於i,將i壓入stack2否則將stack2的棧頂元素壓入stack2
3.pop操作時將stack1與stack2中的元素同時彈出
4.getMin操作檢視stack2的棧頂元素
圖解
程式碼實現
public class SpecialStack {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int x) {
stack1.push(x);
if (stack2.isEmpty() || stack2.peek() > x) {
stack2.push(x);
} else {
stack2.push(stack2.peek());
}
}
public int pop() {
if (!stack1.isEmpty() && !stack2.isEmpty()) {
stack2.pop();
return stack1.pop();
} else {
throw new RuntimeException("棧為空");
}
}
public int top() {
if (!stack1.isEmpty()) {
return stack1.peek();
}
throw new RuntimeException("棧為空");
}
public int getMin() {
if (!stack1.isEmpty()) {
return stack2.peek();
}
throw new RuntimeException("棧為空");
}
}