今天随便刷力扣的时候看到了最小栈,发现力扣上没做过,题不难,于是做了一下
一开始的代码如下:
class MinStack {
Deque<Integer> stack;
Deque<Integer> minStack;
public MinStack() {
stack = new LinkedList<>();
minStack = new LinkedList<>();
}
public void push(int val) {
stack.push(val);
if(minStack.isEmpty() || minStack.peek() >= val)
minStack.push(val);
}
public void pop() {
if(stack.peek() == minStack.peek())
minStack.pop();
stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
很简单的一道题,结果提交时wa了。
看了一眼题解,区别在于pop函数:
public void pop() {//本人写法
if(stack.peek() == minStack.peek())
minStack.pop();
stack.pop();
}
public void pop() {//题解写法
int t = stack.pop();
if(t == minStack.peek())
minStack.pop();
}
乍一看区别不大,区别是两个栈先后问题,不过应该不影响整体代码的执行。
后来想到,题解的写法将栈中元素取出,拆包成int类型而不是包装类Integer类型,若int与Integer比较,则Integer会变成int,在比较数据。
但是本人的写法,有偷懒的嫌疑(,两个栈中取出的是两个Intege类型的r元素,使用"=="比较时比较的是地址而不是内容。
后将其改为equals方法,通过。
public void pop() {
if(stack.peek().equals(minStack.peek()))
minStack.pop();
stack.pop();
}