ЗАКАЗorder-icon

Проверка правильности написания скобок в выражении. Решение тестового задания

Тест

Введите выражение и нажмите Check! для проверки:

Принцип работы функции

В рекурсивную функцию checkBrackets передается массив символов обозначающих скобки $bracketsSigns

$bracketsSigns['br_1']['start']="<";
$bracketsSigns['br_1']['end']=">";
$bracketsSigns['br_2']['start']="{";
$bracketsSigns['br_2']['end']="}";
$bracketsSigns['br_3']['start']="[";
$bracketsSigns['br_3']['end']="]";
$bracketsSigns['br_4']['start']="(";
$bracketsSigns['br_4']['end']=")";

Что бы функция php strpos не вернула false, где надо, добавим порбел к строке и вычтем один символ с номера позиции.

  • Считаем что если есть символ закрытой скобки в исходной строке $str, значит дожен быть символ и открытой скобки
  • Строка между скобками $restStr проверяется рекурсивно как и исходная строка
  • Строка, склеенная из остатков после вырезки из исходной $glueStr, проверяется рекурсивно как и исходная строка

Функция

Скачать готовый пример на php можно здесь. надо только удалить расширение .txt

function checkBrackets($str, $bracketsSigns)
{
$str= " ".$str;
foreach($bracketsSigns as $brace){
if($endPos=strpos($str, $brace['end'])){
$tmpStr = substr($str, 0, $endPos)." ";
if($startPos = strpos(strrev($tmpStr), $brace['start'])){
$restStr=substr($str, strlen($tmpStr)-$startPos, $endPos-strlen($tmpStr)+$startPos);
$glueStr=substr($str, 0, strlen($tmpStr)-$startPos-1).substr($str, $endPos+1, strlen($str));
if(checkBrackets($glueStr, $bracketsSigns)){
if(checkBrackets($restStr, $bracketsSigns)){
return true;
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}elseif($startPos=strpos($str, $brace['start'])){
return false;
}
}
return true;
};

Выводы

Правильное решение тестового задания не гарантирует что бы будете приняты на предложенную вакансию. Никогда не решайте объемных заданий, решайте только те что не составят вам труда или буду полезны лично вам