设计一个支持 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.
思路
一开始以为只要设置一个变量保留记录最小值就行,但是发现如果最小的元素出栈,就找不到第二小的了此方法不行。
可以设置一个辅助栈来实现。
-
压栈:
- 数据栈为空:数据栈、辅助栈压栈
- 数据站不为空:判断当前值是否大于辅助栈栈顶
- 大于栈顶:直接压栈
- 小于等于栈顶:数据栈,辅助栈压栈
-
出栈:
- 数据栈栈顶等于辅助栈栈顶:当前是最小值,数据栈、辅助栈同时出栈
- 数据栈栈顶不等于辅助栈栈顶:数据栈出栈
也可以使用链表代替辅助栈,思路一样。
public class MinStack {
private Stack<Integer> data;
private Stack<Integer> assist;
/** initialize your data structure here. */
public MinStack() {
data = new Stack<>();
assist = new Stack<>();
}
public void push(int x) {
if(data.empty()){ //数据栈为空,添加元素,辅助栈要添加位置0
data.push(x);
assist.push(x);
}else{
/*根据辅助栈顶位置确定取出当前数据站最小数值和新入栈的元素比较
1.如果大于当前最小值,直接压栈
2.如果小于当前最小值,压栈,辅助栈压入当前的位置
*/
if(x > assist.peek()){
data.push(x);
}else{
data.push(x);
assist.push(x);
}
}
}
public void pop() {
if(data.peek().equals(assist.peek())){
System.out.println("data"+data.peek()+"assist:"+assist.peek());
data.pop();
assist.pop();
}else{
data.pop();
}
}
public int top() {
return data.peek();
}
public int getMin() {
return assist.peek();
}
}