Java 通过 pop 方法获取最后一个元素后出现堆栈错误
Java Stack error after getting last element via pop method
我有下面的代码来解决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()
将引发错误。
如果当前字符是左括号,您甚至不需要检查堆栈顶部。如果是右括号,则先检查堆栈是否为空。如果是,return 错误。否则比较最前面的字符再做决定。
我有下面的代码来解决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()
将引发错误。
如果当前字符是左括号,您甚至不需要检查堆栈顶部。如果是右括号,则先检查堆栈是否为空。如果是,return 错误。否则比较最前面的字符再做决定。