括号闭合问题PHP版

写一个函数,判断扩号是否闭合,左右对称即为闭合,如:((())))(())(())))(((((())(()())()()

131 2月之前 PHP 算法

答案

使用PHP的array_pop()和array_push()模拟一个栈,

  1. 遇到左括号进栈
  2. 遇到右括号出栈,如果栈里没有,说明不闭合
  3. 遍历到最后元素,判断栈内为空,即为闭合
function checkClose($str)
{
    $stack = [];

    for ($i = 0; $i < strlen($str); ++$i) {
        if ($str[$i] == '(') {
            $stack[] = '(';
        }

        if ($str[$i] == ')') {
            $border = array_pop($stack);

            if($border == null) {
                return false;
            }
        }
    }

    if (count($stack) == 0) {
        return true;
    }
    return false;
}

测试代码:

var_dump(checkClose('(())'));            // bool(true)
var_dump(checkClose('(())()(('));        // bool(false)
var_dump(checkClose('(())()()'));        // bool(true)
var_dump(checkClose('(())()))'));        // bool(false)
var_dump(checkClose('(5+2)*6/(3-1)'));   // bool(true)