题目
剑指offer30:包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
实例:
1 2 3 4 5 6 7 8
| MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.
|
代码
方案1:使用两个栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class MinStack { private Stack<Integer> stack1,stack2;
public MinStack() { stack1 = new Stack<>(); stack2 = new Stack<>();
} public void push(int x) { stack1.push(x); if(stack2.isEmpty() || x<=stack2.peek()) { stack2.push(x); }
} public void pop() { if(stack1.peek().equals(stack2.peek())) { stack1.pop(); stack2.pop(); }else { stack1.pop(); } } public int top() { return stack1.peek();
} public int min() { return stack2.peek();
} }
|
代码优化
1 2 3 4 5 6
| public void pop() { if(stack1.pop().equals(stack2.peek())) { stack2.pop(); } }
|
随笔
Stack类的peek()方法
返回栈的栈顶元素。
Integer类型的==和equals()
《阿里Java开发手册》中有这样一项强制要求:
“所有整形包装类对象之间值的比较,全部使用equals方法比较。说明:对于Integer var= ?在-128到127范围内的赋值,Integer对象在IntegerCache.cache产生,会复用已有对象,这个区间的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。”
所以:
两个Integer类型数据相等,直接用equals()即可。
方案1的代码中,如果
1 2 3
| if(stack1.peek().equals(stack2.peek())) 写成 if(stack1.peek()==stack1.peek())
|
那么,程序是无法通过的。
java.lang.NullPointerException错误
错误提示:
1
| Exception in thread "main" java.lang.NullPointerException
|
原因:
对象未实例化,就直接使用。