通过pop方法获取最后一个元素后出现Java堆栈错误



我有以下关于Hackerrank解决方案的代码。

public static void main(String[] args) {
System.out.println(isBalanced("{(([])[])[]}"));
}
public static String isBalanced(String s) {
Stack<Character> stack = new Stack<>();
stack.push(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
Character c = s.charAt(i);
Character cStack = stack.peek();

if (cStack == '{' && c == '}' 
|| cStack == '[' && c == ']' 
|| cStack == '(' && c == ')') {
stack.pop();
} else {
stack.push(c);
}
}
if (stack.isEmpty())
return "YES";
return "NO";
}

尽管该代码似乎没有任何问题,但它在Hackerrank页面上引发了以下错误。我已经在本地IDE中测试了输入,因为它是{(([])[])[]},但我不确定是否需要获得最后一个元素(可能是通过Character cStack = stack.peek();stack.pop();获得的(。

所以,你能在Hackerrank页面上查看并测试一下这个代码,让我知道哪里出了问题吗?

更新:

public static String isBalanced(String s) {
Stack<Character> stack = new Stack<>();
stack.push(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
Character c = s.charAt(i);
if (c == '{' || c == '[' || c == '(') {
stack.push(c);
} else if (stack != null) {
Character cStack = stack.peek();
if (cStack == '{' && c == '}'
|| cStack == '[' && c == ']'
|| cStack == '(' && c == ')') {
stack.pop();
}
}
}
if (stack.isEmpty())
return "YES";
return "NO";
}

在调用stack.peek()之前,需要检查堆栈是否为空。在空堆栈上调用pop()peek()将引发错误
如果当前字符是左括号,则您甚至不需要检查堆栈顶部。如果是右括号,则首先检查堆栈是否为空。如果是,则返回false。否则,比较最重要的角色并做出决定。

最新更新