Java 堆栈弹出函数

Java 堆栈弹出函数,java,stack,Java,Stack,我正在研究Leetcode的一个算法问题,我发现这两个不同的pop()函数给出了不同的结果。(当然其中一个不起作用) 我不明白有什么区别。 为什么创建int可以工作,而另一个不行 public void pop() { if ( minStack.peek() == mainStack.pop()) { minStack.pop(); } } 及 区别在于指针 一旦从堆栈中弹出一个元素,指针就会移动到堆栈中的下一个元素。在本例中,第一个代码先查看然后弹出,而第二个代码先弹出元素

我正在研究Leetcode的一个算法问题,我发现这两个不同的pop()函数给出了不同的结果。(当然其中一个不起作用) 我不明白有什么区别。 为什么创建int可以工作,而另一个不行

public void pop() {
  if ( minStack.peek() == mainStack.pop()) {
    minStack.pop();
  }
}


区别在于指针

一旦从堆栈中弹出一个元素,指针就会移动到堆栈中的下一个元素。在本例中,第一个代码先查看然后弹出,而第二个代码先弹出元素然后尝试查看


如果查看,您将看到当调用
pop()
时(即使它在
If
语句中),它将弹出该元素并将指针移动到下一个元素。

如果将表达式展开到解析步骤中,第一个元素就是这样做的:

public void pop() {
  int a = minStack.peek();
  int b = mainStack.pop();
  boolean e = (a == b);
  if (e) {
    minStack.pop();
  }
}
public void pop() {
  int a = mainStack.pop();
  int b = minStack.peek();
  boolean e = (a == b);
  if (e) {
    minStack.pop();
  }
}
这就是第二个正在做的:

public void pop() {
  int a = minStack.peek();
  int b = mainStack.pop();
  boolean e = (a == b);
  if (e) {
    minStack.pop();
  }
}
public void pop() {
  int a = mainStack.pop();
  int b = minStack.peek();
  boolean e = (a == b);
  if (e) {
    minStack.pop();
  }
}
您的第一个代码示例首先计算peek,并将其与pop进行比较,因此它将顶部项目与自身进行比较。第二个做弹出,然后偷看,比较两个不同的项目


尝试在每个步骤后运行调试器并检查列表

这是否意味着顺序很重要?因为我用peek做minStack,用pop做mainStack。我看不出这两个元素之间有什么区别,除了先声明一个之外。因此,当我在if语句中执行mainStack.pop()时,我不是在计算被弹出的元素,而是在计算堆栈中的下一个元素?我们是否可以看到两个版本的pop()的最终值?没有区别。此代码的两个版本的工作方式相同,除非两个变量引用同一堆栈。