这道题是LeetCode里的第155道题。
题目描述:
设计一个支持 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.
这题看起来挺简单的,但其实设计起来还挺复杂,或者说坑比较多,对 空栈 的处理很严格。
解题代码:
class MinStack {
Stack<Integer> minStack;
Stack<Integer> data;
/** initialize your data structure here. */
public MinStack() {
minStack = new Stack<Integer>();
data = new Stack<Integer>();
}
public void push(int x) {
data.push(x);
if(minStack.empty())
minStack.push(x);
else if(minStack.peek() >= x)
minStack.push(x);
// else
// minStack.push(x);
// if(x <= minStack.peek())
// minStack.push(x);
}
public void pop() {
if(data.empty())return;
//System.out.print(data.peek());
//System.out.print(" "+minStack.peek());
//System.out.print(" "+minStack.empty());
//System.out.print(" "+(data.peek().equals(minStack.peek())));
//if(!minStack.empty() && data.peek() == minStack.peek()){
if(!minStack.empty() && data.peek().equals(minStack.peek())){
//System.out.print(" "+minStack.peek());
minStack.pop();
}
//System.out.println();
data.pop();
}
public int top() {
return data.peek();
}
public int getMin() {
if(minStack.empty())return 0;
return minStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
提交结果:
个人总结:
出了好多的问题,比如比较相等上,直接用等号是不行的,因为 Interger 是一个类,每一个 Interger 数据是一个对象,我们这样比较比较的是它们之间的引用,这是肯定不会相等的。
下次使用数组试试!或者一个栈!