Java不使用栈判断给定字符串是否为平衡字符串
需求确认
我完全明确你的实现目标,这个是栈结构的经典落地场景,和标准平衡括号校验属于同一类问题,核心判定规则和你参考的示例逻辑完全对齐:
- 字符串中所有成对匹配的对称符号(常见如小括号、中括号、大括号,可按需扩展其他配对)必须正确嵌套、顺序匹配,不能出现交叉配对、单边缺漏、顺序颠倒的情况
- 空串默认判定为平衡字符串
- 不属于配对符号的普通字符不影响平衡性判定,遍历过程直接跳过即可
- 判定逻辑全程遵循后进先出的匹配规则:遇到左配对符号压栈,遇到右配对符号时弹出栈顶元素校验是否为对应匹配的左符号,全程不匹配直接返回非平衡,遍历完成后栈为空才判定为平衡
可直接复用的实现代码(Java版)
import java.util.*; public class BalancedStringChecker { // 维护配对映射:key为右闭合符号,value为对应的左开启符号 private static final Map<Character, Character> MATCH_PAIRS = Map.of( ')', '(', ']', '[', '}', '{' // 有其他配对需求(比如尖括号、中文括号、引号等)直接在这里追加即可 ); public static boolean isBalanced(String source) { // 空串直接返回平衡 if (source == null || source.isEmpty()) { return true; } Deque<Character> matchStack = new ArrayDeque<>(); for (char cur : source.toCharArray()) { // 遇到左开启符号,压入栈顶 if (MATCH_PAIRS.containsValue(cur)) { matchStack.push(cur); continue; } // 遇到右闭合符号,做匹配校验 if (MATCH_PAIRS.containsKey(cur)) { // 栈空说明没有对应的左符号,栈顶不匹配说明顺序错误,直接返回false if (matchStack.isEmpty() || matchStack.pop() != MATCH_PAIRS.get(cur)) { return false; } } // 其他普通字符直接跳过,不做处理 } // 遍历结束栈为空,说明所有左符号都完成了匹配 return matchStack.isEmpty(); } // 测试用例 public static void main(String[] args) { System.out.println(isBalanced("()[]{}")); // true System.out.println(isBalanced("({[]})")); // true System.out.println(isBalanced("(]")); // false System.out.println(isBalanced("([)]")); // false System.out.println(isBalanced("a(b)c[d]{e}f")); // true } }
扩展提示:如果你的业务场景需要处理转义字符(比如被反斜杠转义的引号不算有效配对边界),只需要在遍历字符时增加转义状态位,遇到转义符时跳过下一个字符的配对校验即可,核心栈逻辑不需要改动。
如果是其他技术栈实现,只需要把栈结构替换为对应语言的原生栈/数组模拟栈即可,逻辑完全通用。
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

