括号匹配需用栈判断合法性:遇左括号入栈,遇右括号检查栈顶是否匹配,遍历完栈为空则合法;空串返回true,开头右括号或栈空时弹出、最终栈非空均返回false。

括号匹配是经典的栈应用题,PHP 实现的关键在于用数组模拟栈结构,逐字符扫描并动态判断合法性。
核心思路:用数组当栈,遇左括号入栈,遇右括号比对栈顶
PHP 中可直接用 array_push() 和 array_pop() 模拟入栈、出栈。遍历字符串时:
- 遇到
(、[、{就压入栈 - 遇到
)、]、}就检查栈是否为空;若不空,弹出栈顶并与当前右括号配对;不匹配则直接返回 false - 遍历结束后,栈必须为空才算完全匹配
注意边界情况:空串、单括号、嵌套与交叉
合法如 "{[()]}"(嵌套),非法如 "([)]"(交叉)或 "((("(无闭合)。代码需覆盖:
- 空字符串 → 返回 true(按多数题目定义)
- 开头就是右括号 → 立即 pop 失败,应判栈空后拒绝
- 所有左括号未被消耗 → 最终栈非空,返回 false
完整可运行代码示例
(支持三种括号,忽略其他字符)
立即学习“PHP免费学习笔记(深入)”;
function isValid($s) {
$stack = [];
$map = [')' => '(', ']' => '[', '}' => '{'];
for ($i = 0; $i < strlen($s); $i++) {
$char = $s[$i];
if (in_array($char, ['(', '[', '{'])) {
array_push($stack, $char);
} elseif (isset($map[$char])) {
if (empty($stack) || array_pop($stack) !== $map[$char]) {
return false;
}
}
// 忽略非括号字符(如题目允许)
}
return empty($stack);
}
// 测试
var_dump(isValid("()")); // true
var_dump(isValid("()[]{}")); // true
var_dump(isValid("([)]")); // false
var_dump(isValid("{[]}")); // true
进阶优化点:提前终止与空间节省
字符串长度为奇数可直接返回 false(括号必须成对);也可用索引变量代替数组存储栈,减少内存分配:
- 用 $stack = '' 字符串 + substr() 模拟栈(尾部追加/截断)
- 或用整型数组索引 $top 控制栈顶位置,避免频繁 array_pop
- 但对一般题目,原生数组栈已足够清晰高效











