@kiberlain

Как проверить строку на сбалансированность скобок?

есть строка var s = 'foo(bar[baz]){qux}'
Надо проверить что в ней правильно расставлены скобочки. С чего начать?
  • Вопрос задан
  • 16583 просмотра
Пригласить эксперта
Ответы на вопрос 4
SHVV
@SHVV
Ололошки уже три ответа и ни одного правильного.
function isBalanced(str) {
    // пары открывающих-закрывающих скобок
    var br = "(){}[]";
    // стек открытых скобок
    var st = [];
    // бежим по всей строке
    for (var i = 0; i < str.length; ++i) {
        // текущий символ
        var ch = str[i];
        // ищем символ в скобках
        var ind = br.indexOf(ch);
        // если скобка найдена
        if (ind >= 0) {
            // проверяем, какая это скобка
            if (ind & 1) {
                // если закрывающая скобка, проверяем стек
                // стек пуст - плохо
                if (!st.length) return false;
                // извлекаем последнюю открытую скобку из стека
                var last_br = st.pop();
                // если она не соответствует закрывающей скобке - тоже плохо
                if (last_br != br[ind - 1]) return false;
            } else { 
                // открывающую скобку просто пихаем в стек
                st.push(ch);
            }
        }
    }
    // если после обхода всей строки стек пуст - всё ок
    return !st.length;
}

Проверять тут.
Ответ написан
@IceJOKER
Web/Android developer
самая первая мысль - подсчитать кол. открытых скобок и закрытых - если равны, значит все окей(но тут есть загвоздка с расположением скобок)

if(s.split("(").length == s.split(")").length) alert('ok'); else alert('not ok')
Ответ написан
Комментировать
@SpaceMaster1
(s.split('(') !== s.split(')')) || (s.split('[') !== s.split(']')) || (s.split('{') !== s.split('}'))

Это если подвхождения не учитывать, с подвхождениями - в рекурсии проверяете каждый элемент массива s.split
Ответ написан
Комментировать
nalomenko
@nalomenko
Руководитель отдела разработок в студии «Lava»
Например, с помощью вот такой функции isBalanced():

var haveSameLength = function(str, a, b){
    return (str.match(a) || [] ).length === (str.match(b) || [] ).length;
};
var isBalanced = function(str){
    var arr = [ 
        [ /\(/gm, /\)/gm ], [ /\{/gm, /\}/gm ], [ /\[/gm, /\]/gm ] 
    ], i = arr.length, isClean = true;

    while( i-- && isClean ){
        isClean = haveSameLength( str, arr[i][0], arr[i][1] );
    }
    return isClean;
};


Более полный разбор полётов тут
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы