(leetCode#20(编码问题:给定仅包含字符"("、"("、"{"、"}"、"["one_answers"]"的字符串s,请确定输入字符串是否有效。
输入字符串在以下情况下有效:
- 开括号必须由相同类型的括号闭合
- 打开的支架必须按正确顺序关闭
下面是这个编码问题的答案。
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()"
的行。
&是短路运算符,这意味着如果!stack.isEmpty()
为false,则stack.peek()
将不会执行。这样就可以确保只有堆栈不是空的,然后你就可以偷看并弹出它。