有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java堆栈pop函数

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

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

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

共 (2) 个答案

  1. # 1 楼答案

    区别在于指针

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

    如果查看https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html,您将看到当调用pop()时(即使它在if语句中),它将弹出该元素并将指针移动到下一个元素

  2. # 2 楼答案

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

    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进行比较,因此它会将最上面的项与自身进行比较。第二个做弹出,然后偷看,比较两个不同的项目

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