设计一个有getMin功能的栈
要求:
- pop、push、getMin操作的时间复杂度都是O(1)
- 设计的栈可以使用现成的栈结构
本题其实就是要设计一个方法,可以随时查找到栈中的最小值,可以使用两个栈来解决这个问题,一个栈用来保存数据,另一个栈用来保存最小值。
具体思路:
- 有一个数据date入栈时,先将date压入date栈,然后判断min栈是否有数据,如果没有数据直接将date压入min栈。
- 如果min栈中有数据,那么查看栈顶的数据,如果大于或者等于date,将date压入min栈;如果小于date,不进行任何操作。
- 出栈时,判断date栈中是否有数据,如果有数据,将数据弹出,并判断弹出的数据是否等于min栈顶的数据,如果等于,将min栈弹出一个数据。
- 如果弹出的数据大于min栈顶的数据,不进行任何操作。
- 查找栈中的最小值只需要调用min栈的peek方法即可。
public class MinStack {
private Stack<Integer> dateStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public void push(Integer date){
dateStack.push(date);
if(minStack.isEmpty()){
minStack.push(date);
}else{
Integer peek = minStack.peek();
if(peek >= date){
minStack.push(date);
}
}
}
public Integer pop() throws Exception {
if(!dateStack.isEmpty()){
Integer value = dateStack.pop();
if(value.equals(minStack.peek())){
minStack.pop();
}
return value;
}
throw new Exception("Stack isEmpty!");
}
public Integer getMin() throws Exception {
if(!minStack.isEmpty()){
return minStack.peek();
}
throw new Exception("Stack isEmpty!");
}
}