题目描述
设计一个支持 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.
题解
在自定义的栈类中,声明两个栈成员变量stackData和stackMin。stackData用于存储当前栈中的元素;stackMin用于保存当前栈中元素的最小值。
方法一:
压入数据规则:令压入数据为x,直接压入到stackData中。然后判断stackMin是否为空,若stackMin为空则压入x,若不为空,则比较x和stackMin中栈顶元素的大小,若x小于等于stackMin.peek()则压入stackMin中,否则不压入。所以stackData中的元素是从栈底到栈顶依次减小的。
弹出数据规则:弹出stackData中的栈顶元素记为x,比较x和stackMin中栈顶元素是否相等,若相等则弹出stackMin中栈顶元素,否则不弹出。
后来压入到stackMin中的元素在弹出时会较之前的先弹出,所以不会存在元素已经弹出stackMin中还存在该元素的情况。
public class MinStack {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
/** initialize your data structure here. */
public MinStack() {
stackData=new Stack<>();
stackMin=new Stack<>();
}
public void push(int x) {
stackData.push(x);
if(stackMin.isEmpty())
stackMin.push(x);
else {
if(stackMin.peek()>=x)
stackMin.push(x);
}
}
public void pop() {
if(!stackData.isEmpty()) {
int x=stackData.pop();
if(x==stackMin.peek())
stackMin.pop();
}
}
public int top() {
if(!stackData.isEmpty()) {
return stackData.peek();
}
return -1;
}
public int getMin() {
if(stackMin.isEmpty())
return -1;
return stackMin.peek();
}
}
方法二:
压入数据规则:令压入数据为x,直接压入到stackData中。压入数据规则:令压入数据为x,直接压入到stackData中。然后判断stackMin是否为空,若stackMin为空则压入x,若不为空,则比较x和stackMin中栈顶元素的大小,若x小于等于stackMin.peek()则压入stackMin中,否则将stackMin中的栈顶元素重复压入。
弹出数据规则:弹出StackData中栈顶元素同时也弹出stackMin中的元素。
public class MinStack2 {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MinStack2() {
stackData=new Stack<>();
stackMin=new Stack<>();
}
public void push(int x) {
stackData.push(x);
if(stackMin.isEmpty())
stackMin.push(x);
else {
if(stackMin.peek()>x)
stackMin.push(x);
else
stackMin.push(stackMin.peek());
}
}
public void pop() {
if(!stackData.isEmpty()) {
stackData.pop();
stackMin.pop();
}
}
public int top() {
if(!stackData.isEmpty())
return stackData.peek();
return -1;
}
public int getMin() {
if(!stackMin.isEmpty())
return stackMin.peek();
return -1;
}
}