如果有一个空堆栈(java),为什么会出现问题



(leetCode#20(编码问题:给定仅包含字符"("、"("、"{"、"}"、"["one_answers"]"的字符串s,请确定输入字符串是否有效。

输入字符串在以下情况下有效:

  1. 开括号必须由相同类型的括号闭合
  2. 打开的支架必须按正确顺序关闭

下面是这个编码问题的答案。

class Solution {
public boolean isValid(String s) {
Stack <Character> stack = new Stack <Character>();
for (char c: s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
}
else if (c == ')' && !stack.isEmpty() && stack.peek() == '(') {
stack.pop();
}
else if (c == '}' && !stack.isEmpty() && stack.peek() == '{') {
stack.pop();
}
else if (c == ']' && !stack.isEmpty() && stack.peek() == '[') {
stack.pop();
}
else return false;

}
return stack.isEmpty();
}
}

我有点困惑的是,什么是目的的"!stack.isEmpty(("?如果我把它们擦掉"它抛出一个运行时错误;java.util.EmptyStackException";。有人能澄清一下吗?我今天学会了堆叠,所以我有点困惑。

Stack#peek查看最顶端的元素并返回其值。如果没有最上面的元素(即堆栈为空(,它将抛出一个EmptyStackException。这就是为什么你在偷看之前要检查它是否是空的。

请参阅Javadoc

作为一个异常,表示您正在操作一个不应该为空的空堆栈。如果你能发布更多的错误消息,我想可以定位到导致错误的"stack.peek()"的行。

&amp是短路运算符,这意味着如果!stack.isEmpty()为false,则stack.peek()将不会执行。这样就可以确保只有堆栈不是空的,然后你就可以偷看并弹出它。

最新更新