Java使用单栈与switch语句实现括号字符串校验的问题咨询
问题答疑
switch的default分支确实会捕获空格字符,你的代码无法正常运行是核心逻辑和分支处理有两处错误:
matching方法的default分支直接抛出异常,所有非右括号的字符(包括三种左括号、空格)都会触发异常终止程序,根本无法完成正常校验- 整体校验逻辑顺序错误,你没有区分左括号、右括号、无关字符的处理规则,所有字符都先调用
matching方法做匹配,不符合括号校验的逻辑要求
修正方案
方案1:仅保留一个switch语句实现(符合你要求的最简写法)
out.println(checkParentheses("({} [()] ({}))")); // 输出true out.println(!checkParentheses("({} [() ({)})")); // 输出true(原字符串非法,取反后为true) Boolean checkParentheses(String brackets) { Deque<Character> stack = new ArrayDeque<>(); for (char ch : brackets.toCharArray()) { switch (ch) { // 左括号直接压栈 case '(': case '[': case '{': stack.push(ch); break; // 右括号做匹配校验 case ')': if (stack.isEmpty() || stack.pop() != '(') return false; break; case ']': if (stack.isEmpty() || stack.pop() != '[') return false; break; case '}': if (stack.isEmpty() || stack.pop() != '{') return false; break; // 空格等其他无关字符直接跳过 default: break; } } return stack.isEmpty(); }
方案2:保留独立matching方法的写法
如果你需要把匹配逻辑单独抽离,调整调用顺序即可:
Boolean checkParentheses(String brackets) { Deque<Character> stack = new ArrayDeque<>(); for (char ch : brackets.toCharArray()) { // 只有右括号才需要调用匹配方法 if (ch == ')' || ch == ']' || ch == '}') { if (stack.isEmpty() || stack.pop() != matching(ch)) return false; } else if (ch == '(' || ch == '[' || ch == '{') { stack.push(ch); } // 空格等其他字符直接跳过,不需要处理 } return stack.isEmpty(); } char matching(char ch) { switch (ch) { case ')': return '('; case ']': return '['; case '}': return '{'; default: throw new IllegalArgumentException("非法右括号字符"); } }
内容的提问来源于stack exchange,提问作者Muguwaranojar
相关产品推荐
相关产品推荐

