题目:
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
方法一:
同步栈:用两个栈,一个用来存储数据,另一个单调栈用来存储最小值,
每次向数据栈data里面入栈时,将栈里面的最小值存入单调栈中,因此需要判断每次入栈元素是否小于单调栈中栈顶元素,小于则将入栈元素入栈,否则将单调栈栈顶元素入栈;出栈时将两个栈的栈顶元素出栈;
class MinStack {
Stack<Integer> data;
Stack<Integer> height;
/** initialize your data structure here. */
public MinStack() {
data=new Stack<>();
height=new Stack<>();
}
public void push(int x) {
data.push(x);
if(height.isEmpty()||height.peek()>=x){
height.push(x);
}else{
height.push(height.peek());
}
}
public void pop() {
if(!data.isEmpty()){
data.pop();
height.pop();
}
}
public int top() {
return data.peek();
}
public int getMin() {
return height.peek();
}
}
方法二:
非同步栈:类似于同步栈,入栈时如果入栈元素大于单调栈栈顶元素则不入栈;出栈时如果出栈元素等于单调栈栈顶元素则出栈;
class MinStack {
Stack<Integer> data;
Stack<Integer> height;
/** initialize your data structure here. */
public MinStack() {
data=new Stack<>();
height=new Stack<>();
}
public void push(int x) {
data.push(x);
if(height.isEmpty()||height.peek()>=x){
height.push(x);
}
}
public void pop() {
int x=0;
if(!data.isEmpty()){
x=data.pop();
}
if(x==height.peek()){
height.pop();
}
}
public int top() {
return data.peek();
}
public int getMin() {
return height.peek();
}
}
方法三:
用一个栈存储,当有更小的值来的时候,我们只需要把之前的最小值入栈,当前更小的值再入栈即可。当这个最小值要出栈的时候,下一个值便是之前的最小值了。
class MinStack {
Stack<Integer> s;
int min=Integer.MAX_VALUE;
/** initialize your data structure here. */
public MinStack() {
s=new Stack<>();
}
public void push(int x) {
if(x<=min){
s.push(min);
min=x;
}
s.push(x);
}
public void pop() {
if(s.pop()==min){
min=s.pop();
}
}
public int top() {
return s.peek();
}
public int getMin() {
return min;
}
}