Web

Как проверить, что все скобки правильно открыты/закрыты

Я пытаюсь написать функцию, которая будет возвращать true, если скобки закрыты, например, {[()]} и false, если скобки открыты, например ) (. У меня проблема с написанием логики. У меня есть кое-что по коду, но он не работает, и я не знаю, в каком направлении смотреть.

function test($result) {

    if( $result % 2 === 0 ) { 

        return true;

    } else {

      return false;

    }

}

 

Ответ 1

Начнем с удаления любых наборов символов, которые не используются {}[]или ().  Я создал вспомогательные функции, которые проверяют, существует ли какие-либо из этих наборов в строке, а также функцию replace для их удаления. пока ничего нельзя будет заменить. Наконец, надо проверить, равна ли оставшаяся длина строки после удаления всех наборов 0. Это означает, что все скобки правильно открываются и закрываются. В противном случае возвращаем false.

function exist($c, $s){

    return strpos($s, $c) !== false;

}

function replace($c, $s){

    return str_replace($c, "", $s);

}

function open_closed($str){

    // удаляем символы

    $str = preg_replace("/[^\{\}\(\)\[\]]+/", '', $str);

    while(true){

        if(exist("{}", $str))

            $str = replace("{}", $str);

        elseif(exist("[]", $str))

            $str = replace("[]", $str);

        elseif(exist('()', $str))

            $str = replace("()", $str);

        else

            break;

    }

    return !strlen($str);

}

 

$string1 = "[{()[Hello]{}}]";

var_dump(open_closed($string1));  //  true

 

[{()[]}]

[{()}]

[{}]

[]


$string2 = "abc[({})][({)]99";

 

var_dump(open_closed($string2)); // false

 

[({})][({)]

[()][({)]

[][({)]

[({)]

 

 Ответ 2

Попробуйте использовать стековую структуру данных. Если вы нашли открывающую скобку, переместите ее в стек. Если вы нашли закрывающую скобку, вытащите верхний элемент из стека. Если он не подходит, например, первая скобка - ), а вытолкнутый элемент - [ или стек пуст, то выражение недействительно.

Важно: в конце выражения стек должен быть пуст.

 

Ответ 3

Простой, немного грубый метод (и далеко не идеальное решение). Это скорее ответ для начинающих:

  1. Удалите все остальные символы (если они есть)

  2. Замените все наборы (например, {}, [] и ())

  3. Является ли результат пустой строкой (все совпадения исчезли, значит, true).

Сделайте цикл, заменяя все закрытые множества и затем смотрите, стала ли она короче. Если нет, то остановите цикл. Если да, то продолжите цикл еще на одну итерацию. И когда он закончится и станет пустым, все станет ясно :)

Примеры:

  • [{}] -> [] ->  => true

  • ({}[{}]) -> ([]) -> () ->  => true

  • {]} -> ] => false

 

Ответ 4

Другой подход с использованием Stack. Итерация по строке выражения exp. Если текущий символ является открытой скобкой '(' или '{' или '[', то поместите его в стек. если текущий символ является закрывающей скобкой ')' или '}' или ']', то извлеките его из стека и посмотрите, если извлеченный символ не совпадает с текущей скобкой, то скобки не сбалансированы. В заключение проверьте, пуст ли стек? Если да, то скобки сбалансированы.

function balanced($expr){

    $open_brackets = ["(", "{", "["];

    $stack = array();

    for ($i=0; $i < strlen($expr); $i++){

        $current_bracket = $expr[$i];

        if(in_array($current_bracket, $open_brackets))

            array_push($stack, $current_bracket);

        else{

            if (empty($stack)) return false;

            $popped_bracket = array_pop($stack);

            if($popped_bracket === "(" and $current_bracket !== ")" )

                    return false;

            if($popped_bracket === "{" and $current_bracket !== "}" )

                    return false;

            if($popped_bracket === "[" and $current_bracket !== "]" )

                    return false;

        }

    }

    return empty($stack);

}

 

Тесты:

var_dump(balanced("[()]{}{[()()]()}")); // true

var_dump(balanced("}{")); // false

var_dump(balanced("[{}(){}]")); // true

 

Схожие статьи

Web

Проблемы при использовании $_REQUEST[]

Web

PHP валидация/регулярное выражение для URL

Web

Как преобразовать объект в массив

Web

Преобразование форматов даты в PHP