括号匹配需用栈验证嵌套顺序与类型对应:左括号入栈,右括号检查栈顶是否匹配,不匹配或栈空则返回false,遍历完栈必须为空;支持自定义括号对和严格模式,时间复杂度O(n)。

检测字符串中括号是否匹配,核心是用栈模拟“先进后出”的配对逻辑:遇到左括号入栈,遇到右括号时检查栈顶是否为对应左括号;不匹配或栈空时直接返回 false;遍历完后栈必须为空才算合法。
基本思路与关键判断点
括号匹配不是单纯数个数,而是关注嵌套顺序和类型对应。常见括号包括 ()、[]、{},需一一对应。算法需处理三类情况:
- 右括号出现时,栈为空 → 缺少对应左括号(如 ")")
- 右括号出现时,栈顶左括号类型不匹配(如 "[)" 或 "{]")
- 遍历结束,栈非空 → 存在未闭合的左括号(如 "(([")
标准实现(使用数组模拟栈)
JavaScript 中可直接用数组的 push() 和 pop() 模拟栈操作,简洁高效:
function isValidParentheses(str) {
const stack = [];
const pairs = { ')': '(', ']': '[', '}': '{' };
for (let char of str) {
if (char === '(' || char === '[' || char === '{') {
stack.push(char);
} else if (char in pairs) {
if (stack.length === 0 || stack.pop() !== pairs[char]) {
return false;
}
}
// 忽略非括号字符(如字母、数字、空格等),按需可扩展校验
}
return stack.length === 0;
}
示例调用:
-
isValidParentheses("()[]{}")→ true -
isValidParentheses("([)]")→ false -
isValidParentheses("((()))")→ true -
isValidParentheses("abc{[123]}")→ true(忽略非括号字符)
增强版:支持自定义括号对与严格模式
若需适配不同符号(如 HTML 标签 )、或要求只允许括号字符(禁止其他内容),可扩展参数:
function isValid(str, brackets = [['(', ')'], ['[', ']'], ['{', '}']], strict = false) {
const stack = [];
const map = new Map(brackets.map(([l, r]) => [r, l]));
const allBrackets = new Set(brackets.flat());
for (let char of str) {
if (map.has(char)) { // 是右括号
if (stack.length === 0 || stack.pop() !== map.get(char)) return false;
} else if (allBrackets.has(char)) { // 是左括号
stack.push(char);
} else if (strict) { // 严格模式:不允许非括号字符
return false;
}
}
return stack.length === 0;
}
这样既保持灵活性,又不牺牲可读性与健壮性。
注意事项与常见陷阱
实际使用中容易忽略几个细节:
- 空字符串
""应返回 true(所有括号都“已匹配”) - 不要用
==比较括号,避免隐式转换(如null == undefined),一律用=== - 正则无法正确处理嵌套(如
"((()))"),纯正则方案不可靠,必须用栈 - 性能上,单次遍历 + O(1) 栈操作,时间复杂度 O(n),空间最坏 O(n)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











