PHP 实现括号匹配算法题

3次阅读

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

PHP 实现括号匹配算法题

括号匹配是经典的栈应用题,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
  • 但对一般题目,原生数组栈已足够清晰高效

text=ZqhQzanResources