堆栈弹出功能

时间:2016-01-26 21:42:57

标签: java stack 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 个答案:

答案 0 :(得分:2)

不同之处在于指针。

从堆栈中弹出一个元素后,指针将移动到堆栈中的下一个元素。在这种情况下,第一个代码首先偷看然后弹出,而第二个代码首先弹出元素然后试图窥视。

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

答案 1 :(得分: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进行比较,以便将顶部项与自身进行比较。第二个是pop,然后是peek,比较两个不同的项目。

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