1.题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
示例:
输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
来源:力扣(LeetCode)
链接:最小栈
2.分析
题目为最小栈,要求在常数时间内能够取得栈中最小元素
此题的关键在于:栈中的元素不仅要取得最小,且不能够影响其他元素的存储和取出
因此需要一个存储器来保存栈中不同状态下元素的最小元素
比如当前栈中有5,3,4,1。最小元素为1,1在栈顶,当弹出1时,栈中的最小元素变为3
因此需要将不同状态下的最小元素保存起来,以便于在栈弹出或增加新的元素时,最小元素随之变换
可以设置一个保存器,在元素进栈时,进行比较,若比当前最小元素小就保存到此存储器中,反之就不保存
当前的最小元素不变。
需要注意的是,在栈取出元素时,当取到最小值要将最小保存器中对应值弹出,以将最小值和栈当前状态对应起来,
详细操作参考下列代码中的push(),pop()函数
3.代码示例
class MinStack {
/** initialize your data structure here. */
private Stack<Integer> stack = new Stack<>();//入队
private Stack<Integer> mstack = new Stack<>();
public MinStack() {
}
public void push(int x) {
if(mstack.empty()){
mstack.push(x);
}else if(x<=mstack.peek()){
mstack.push(x);
}
stack.push(x);
}
public void pop() {
if (stack.peek().equals(mstack.peek())){
mstack.pop();
stack.pop();
}else{
stack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return mstack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/