LeetCode有效括号问题本地测试通过,提交报EmptyStackException如何修复?
修复有效括号问题中的EmptyStackException错误
问题原因
你本地测试没覆盖栈为空时出现右括号的场景(例如输入")"、"}{"这类用例),而LeetCode的测试集包含了这类情况,导致调用values.peek()时栈为空,抛出EmptyStackException。
修复方案
修改代码,在处理右括号前先判断栈是否为空,同时优化逻辑:遇到不匹配的括号直接返回false,提升效率。修复后的代码如下:
import java.util.Stack; class Solution { public boolean isValid(String s) { Stack<Character> values = new Stack<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 左括号入栈 if (c == '(' || c == '[' || c == '{') { values.push(c); } else { // 右括号场景:先判断栈是否为空,空则直接无效 if (values.isEmpty()) { return false; } // 取出栈顶元素判断是否匹配 char top = values.peek(); if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) { values.pop(); } else { // 括号类型不匹配,直接返回false return false; } } } // 遍历结束后栈为空才是有效字符串 return values.isEmpty(); } }
关键修改点
- 将原来的两个独立
if改为if-else结构:确保每个字符要么是左括号入栈,要么是右括号进入处理逻辑,避免重复判断。 - 处理右括号时先检查栈是否为空:如果栈为空,说明没有对应的左括号,直接返回
false。 - 增加不匹配括号的直接返回:当遇到类型不匹配的右括号时,无需继续遍历,直接返回
false,减少不必要的计算。 - 简化最后返回逻辑:直接返回
values.isEmpty(),替代原来的if-else判断。
为什么本地测试通过?
因为你本地测试的用例都是合法的或者以左括号开头的非法用例,没有覆盖到以右括号开头的场景,所以没有触发栈为空的情况。LeetCode的测试集包含了这类边界用例,所以暴露了问题。
内容的提问来源于stack exchange,提问作者pxkaa
相关产品推荐
相关产品推荐

