PHP实现括号匹配(二)

- 2 mins

问题描述:

找出以下字符串中出现成对的括号

{((}[)[][)

要求交叉出现的也需要返回

代码实现

<?php
/**
 * Created by PhpStorm.
 * User: archerZdip
 * Date: 2019-03-04
 * Time: 18:00
 */


/**
 * PHP实现栈数据结构和括号匹配
 *
 * - $str string `数据字符串`
 *
 * @param string $str
 * @return array|bool
 */
function checkBracket(string $str)
{
    if (!$str) return false;

    $arr = str_split($str);
    // 左括号集合
    $left = ['{', '[', '('];
    // 右括号集合
    $right = ['}', ']', ')'];
    // 栈集合
    $stack = [];
    // 结果集合
    $res = [];

    while (count($arr) > 0) {
        // 获取第一个字符
        $shift = array_shift($arr);

        if (in_array($shift, $left, true)) {
            // 把出现的左括号放入栈中
            array_push($stack, $shift);
        } else if (in_array($shift, $right, true)) {
            // 获取概括号的key
            $rightKey = array_search($shift, $right, true);
            if ( count($stack) > 0 ) {
                // 判断栈里是否存在对应括号值
                $pos = array_search($left[$rightKey], $stack, true);
                if ( $pos !== false ) {
                    // 删除对应位置
                    unset($stack[$pos]);

                    // 将结果存入数组中
                    array_push($res, $left[$rightKey] . $shift);
                }
            }
        }
    }

    return empty($res) ? false : $res;

}

$test = '{((}[)[][)';
var_dump(checkBracket($test));

结果

array (size=4)
  0 => string '{}' (length=2)
  1 => string '()' (length=2)
  2 => string '[]' (length=2)
  3 => string '()' (length=2)

若有不足请见谅包含!

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora