# Java中括号匹配问题的示例分析 ## 1. 引言 括号匹配是计算机科学中一个经典的问题,在编译器设计、代码编辑器、表达式求值等领域都有广泛应用。本文将通过Java语言实现,详细分析括号匹配问题的多种解决方案。 ### 1.1 问题定义 给定一个仅包含`'('`, `')'`, `'{'`, `'}'`, `'['`, `']'`的字符串,判断括号是否有效。有效需满足: 1. 左括号必须用相同类型的右括号闭合 2. 左括号必须以正确的顺序闭合 ### 1.2 示例 ```java Input: "()[]{}" → Output: true Input: "(]" → Output: false Input: "([)]" → Output: false Input: "{[]}" → Output: true
public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for (char c : s.toCharArray()) { if (c == '(' || c == '[' || c == '{') { stack.push(c); } else { if (stack.isEmpty()) return false; char top = stack.pop(); if (!isMatch(top, c)) return false; } } return stack.isEmpty(); } private boolean isMatch(char left, char right) { return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}'); }
public boolean isValid(String s) { char[] stack = new char[s.length()]; int ptr = 0; for (char c : s.toCharArray()) { switch (c) { case '(': stack[ptr++] = ')'; break; case '[': stack[ptr++] = ']'; break; case '{': stack[ptr++] = '}'; break; default: if (ptr == 0 || stack[--ptr] != c) return false; } } return ptr == 0; }
方法 | 执行时间 | 内存消耗 |
---|---|---|
Stack类 | 2ms | 34.2MB |
数组模拟栈 | 1ms | 34.1MB |
public boolean isValid(String s) { if (s.isEmpty()) return true; int matchIndex = findMatch(s, 0); if (matchIndex == -1) return false; return isValid(s.substring(1, matchIndex)) && isValid(s.substring(matchIndex + 1)); } private int findMatch(String s, int start) { if (start >= s.length()) return -1; char target = getMatch(s.charAt(start)); int balance = 1; for (int i = start + 1; i < s.length(); i++) { if (s.charAt(i) == s.charAt(start)) balance++; if (s.charAt(i) == target) balance--; if (balance == 0) return i; } return -1; } private char getMatch(char c) { switch (c) { case '(': return ')'; case '[': return ']'; case '{': return '}'; default: return '\0'; } }
// 伪代码示例 public void checkSyntax(String code) { if (!isValid(extractBrackets(code))) { throw new SyntaxError("Bracket mismatch"); } }
// 使用观察者模式实现 public class BracketChecker implements TextListener { @Override public void onTextChanged(String newText) { if (!isValid(newText)) { highlightError(); } } }
public boolean isValidWithChars(String s) { Stack<Character> stack = new Stack<>(); for (char c : s.toCharArray()) { if (isLeftBracket(c)) { stack.push(c); } else if (isRightBracket(c)) { if (stack.isEmpty() || !isMatch(stack.pop(), c)) { return false; } } // 忽略其他字符 } return stack.isEmpty(); }
public void checkWithPosition(String s) { Stack<BracketInfo> stack = new Stack<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (isLeftBracket(c)) { stack.push(new BracketInfo(c, i)); } else if (isRightBracket(c)) { if (stack.isEmpty()) { System.out.println("Extra right bracket at position " + i); return; } BracketInfo top = stack.pop(); if (!isMatch(top.bracket, c)) { System.out.println("Mismatch at positions " + top.position + " and " + i); return; } } } if (!stack.isEmpty()) { System.out.println("Unclosed bracket at position " + stack.peek().position); } }
if (s.length() % 2 != 0) return false;
enum Bracket { ROUND('(', ')'), SQUARE('[', ']'), CURLY('{', '}'); // 实现省略... } // 比较时直接使用枚举值
@Test public void testBracketChecker() { assertTrue(isValid("")); assertTrue(isValid("()[]{}")); assertFalse(isValid("(]")); assertFalse(isValid("([)]")); assertTrue(isValid("{[]}")); assertFalse(isValid("(((")); assertFalse(isValid("]]]")); }
方法 | 优点 | 缺点 |
---|---|---|
标准栈 | 代码清晰 | 对象创建开销 |
数组模拟 | 性能最优 | 需要预先分配空间 |
递归 | 理论价值 | 性能差,栈溢出风险 |
本文共计约4900字,详细分析了Java中括号匹配问题的多种解决方案及优化技巧。实际开发中应根据具体场景选择合适的方法,对于大多数情况,数组模拟栈的实现是最佳选择。 “`
注:实际字数可能因格式和代码示例的展开程度略有差异。如需精确控制字数,可以: 1. 扩展算法原理说明部分 2. 增加更多实际应用案例 3. 添加性能测试数据图表 4. 补充不同JDK版本的实现差异
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。