问题描述
实现O(1)获取最大最小值的栈
问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数,getMax函数。在该栈中,调用getMin、getMax、push及pop的时间复杂度都是O(1).
思路
定义一个minStack辅助栈每次记住入栈stack的最小值,即:将数据分别入栈stack和minStack,当入栈minStack的时候,与栈顶元素比较大小,若小于栈顶元素,则入栈成为新的栈顶元素,若大于栈顶元素,则入栈原先的栈顶元素。
getMax的思路同上。
代码
import java.util.Stack;
/**
* 实现O(1)获取最大最小值的栈
*/
public class NewStack{
Stack<Integer> stack = new Stack<>();
Stack<Integer> maxStack = new Stack<>();
Stack<Integer> minStack = new Stack<>();
public void Push(int e){
stack.push(e);
if (minStack.empty() || e < minStack.peek()){
minStack.push(e);
}else if (e > minStack.peek()){
minStack.push(minStack.peek());
}
if (maxStack.empty() || e > maxStack.peek()){
maxStack.push(e);
}else if (e < maxStack.peek()){
maxStack.push(maxStack.peek());
}
}
//pop时要注意栈是否为空
public int Pop(){
if (!stack.empty()&&!maxStack.empty()&&!minStack.empty()){
int e = stack.pop();
minStack.pop();
maxStack.pop();
return e;
}
else {
System.out.println("栈为空!");
return 0;
}
}
public int getMax(){
return maxStack.peek();
}
public int getMin(){
return minStack.peek();
}
}