题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路
使用一个辅助栈保存入栈元素的最小值。
首先创建两个栈:
- 栈A:数据栈。用于保存数据,保证栈的push()、pop()等功能正常实现。
- 栈B:辅助栈。用于保存数据的最小值。
操作:
- 有数据入栈时,如果栈A为空,则直接入栈A、栈B;如果数据大于栈B的栈顶元素,数据入栈A;如果数据小于栈B的栈顶元素,此时数据为最小,入栈A、栈B;栈B将栈A的部分数据升序保存,栈顶的数据为最小。
- 有数据出栈时,如果栈A的栈顶元素等于栈B的栈顶元素,栈A、栈B出栈。
class MinStack {
Stack<Integer> A;
Stack<Integer> B;
/** initialize your data structure here. */
public MinStack() {
//初始化栈
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
if(A.empty() || x <= B.peek()) {
B.push(x);
}
A.push(x);
}
public void pop() {
//Stack类的泛型是Integer封装类,要比较两个Integer类型的数据是否相等得用equals()方法
//==比较的是地址值
if(A.peek().equals(B.peek())) {
B.pop();
}
A.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}