思路
用一个栈 stackData
来实现基本的功能,用另外一个单调栈 stackMin
来维护栈中的最小值。在单调栈中元素都是逐步递减的,栈顶元素一定是最小的。
向栈中添加元素
如果说当前添加的元素是x,先将该元素添加到stackData
中。然后判断stackMin
是否是空:
- 为空,就将当前元素加入
stackMin
中。 - 不为空:为了维护单调栈的单调性,我们要进行判断,如果说比栈顶元素大,说明没有必要将他添加到
stackMin
中,因为他不可能是当前栈中最小的元素。反之就将他添加进来
弹出栈顶元素
- 对于
stackData
正常弹出 - 而对于
stackMin
来讲,如果弹出的元素是栈顶,就要进行把它进行弹出,反之,不会
代码
class MinStack {
private LinkedList<Integer> stackData;
private LinkedList<Integer> stackMin;
public MinStack() {
stackData = new LinkedList<>();
stackMin = new LinkedList<>();
}
public void push(int x) {
stackData.add(x);
if(stackMin.size() == 0) {
stackMin.add(x);
} else {
if(stackMin.getLast() >= x) {
stackMin.add(x);
}
}
}
public void pop() {
int value = stackData.getLast();
stackData.removeLast();
if(value == stackMin.getLast()) {
stackMin.removeLast();
}
}
// 获取栈顶元素
public int top() {
return stackData.getLast();
}
// 获取最小值
public int min() {
return this.stackMin.getLast();
}
}