一、题目
实现最小栈类,栈+获取栈中最小元素。
push(int val)将元素val推入栈中,pop()删除栈中顶部的元素,
top()获取栈中顶部的元素,getMin()获取栈中最小元素。

二、思路
1、普通的栈可以实现push、pop、top,都是O(1),而找最小值要遍历整个栈,并且getMin()也要求O(1),所以不能临时计算,要利用一个主栈存储所有入栈的原始数据,同时维护一个最小值栈(栈顶始终是主栈中的最小值)。
2、push(val)时,如果 val 小于或等于 minStack 的栈顶(当前最小值),就把 val 也压入 minStack。
pop()时,如果弹出的元素等于 minStack 的栈顶,说明当前最小值被移除了,也要从 minStack弹出。
三、代码
class MinStack {
private Deque<Integer> stack;
private Deque<Integer> minStack;
public MinStack() {
stack = new ArrayDeque<>();
minStack = new ArrayDeque<>();
}
public void push(int val) {
stack.push(val);
if(minStack.isEmpty() || val <= minStack.peek()){
minStack.push(val);
}
}
public void pop() {
int top = stack.pop();
if(top == minStack.peek()){
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
四、语法记录一下
1)Deque<Integer> stack = new ArrayDeque<>();推荐
Deque双端队列,支持栈操作 push() pop() peek()
2)Stack<Integer> stack = new Stack<>();不推荐
3)入栈
stack.push(x)
4)出栈
stack.pop()
5)查看栈顶
stack.peek()
6)判断空
stack.isEmpty() 返回true/false
7)大小
stack.size() 返回元素个数