题目描述:
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) – 将元素 x 推入栈中。
- pop() – 删除栈顶的元素。
- top() – 获取栈顶元素。
- getMin() – 检索栈中的最小元素。
样例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
分析:
- 方法一:
- 定义两个栈,一个数据栈,一个辅助栈
- 每次将新来的元素存入到数据栈中
- 然后查看辅助栈是否为空,若辅助栈为空则新来的元素直接入栈
- 若不为空,将新来的元素和辅助栈的栈顶元素作比较,取其最小值压入辅助栈。
- 每次pop时从数据栈中弹出栈顶数据并弹出辅助栈中的栈顶元素。
- 辅助栈的栈顶元素即为栈中元素中的最小值
- 方法二:
- 和方法一的区别体现在元素压入辅助栈时和弹出元素时
- 若栈顶元素小于新来的元素,则没有元素压入辅助栈;若新来的元素小于辅助栈的栈顶元素,则将该元素入栈
- 在弹出元素时,只有数据栈的栈顶元素和辅助栈的栈顶元素相等时,才将辅助栈的栈顶元素弹出,否则只弹出数据栈的元素。
Stack<Integer> s1;
Stack<Integer> s2;
public MinStack() {
s1=new Stack<>();
s2=new Stack<>();
}
public void push(int x) {
s1.push(x);
if(s2.isEmpty())
s2.push(x);
else
if(s2.peek()<x)
s2.push(s2.peek());
else
s2.push(x);
}
public void pop() {
if(!s1.isEmpty()) {
s1.pop();
s2.pop();
}
}
public int top() {
if(!s1.isEmpty())
return s1.peek();
return -1;
}
public int getMin() {
if(!s2.isEmpty())
return s2.peek();
return -1;
}