Баланс открывающихся и закрывающихся скобок.Стеки в JS
Помогите пожалуйста с программой на JavaScript((((((((
Задание: Проверка баланса открывающихся и закрывающихся скобок через стек. Т.е. 1)Пустая строка допустима; 2)Если () и [] допустимо, то ()[] допустимо; 3)Если () допустимо, то (){}[] допустимо; )(-нет ({)}-нет Нашла множество реализаций данной задачи на других языках, но на JS нет, сама перевести не могу, пожалуйста помогите. |
Обычно стратегия "от центра";
"от центра"; 1. Ищется последняя открывающаяся скобка 2. От текущего местоположения ищется первая закрывающаяся скобка, контент вместе с найденными скобками изымается и помещается в стек. 3. Проверка наличия открывающихся скобок, если да - переход на цифру 1 |
Lesya,
На самом деле, все не так сложно. :) Чтобы проще отслеживать соответствие произвольного символа той или иной скобочной паре, создадим ассоциативный массив (хеш) на основе самих скобочных символов. Значением ключа сделаем объект, содержащий условный идентификатор скобочной пары и флаг, определяющий скобку как открывающую или закрывающую. Стеком пусть будет обычный массив. По мере чтения символов будем смотреть в хеш, и если текущий символ там есть, то: - если скобка открывающая, добавляем в стек идентификатор; - если закрывающая, сравним ее идентификатор с последним значением в стеке, и если идентификаторы не равны или стек уже пуст, значит в строке ошибка, если нет, снимаем шапку стека и продолжаем; К концу строки, если все скобки закрыты, то и стек будет пуст. <body> <input id="string" type="text" size="30"><br><br> <input id="testme" type="button" value="Test me!"><br><br> <span id="result"></span> <script> function bracketTester ( brackets ) { if ( typeof brackets != "string" ) { throw new Error( "'brackets' is not a string" ); } if ( brackets.length % 2 ) { throw new Error( "'brackets' length is not even" ); } var table = {}; var bracket, i; for ( i = 0; i < brackets.length; i++ ) { if ( table.hasOwnProperty( bracket = brackets.charAt( i ) ) ) { throw new Error( "non-unique character encountered" ); } table[ bracket ] = { id : i >>> 1, open : !( i % 2 ) }; } return function ( string ) { if ( typeof string != "string" ) { throw new Error( "'string' is not a string" ); } var stack = []; var bracket, i; for ( i = 0; i < string.length; i++ ) { if ( table.hasOwnProperty( bracket = string.charAt( i ) ) ) { if ( table[ bracket ].open ) { stack.push( table[ bracket ].id ); } else if ( stack.length == 0 || stack.pop() != table[ bracket ].id ) { return false; } } } return stack.length == 0; } } var test = bracketTester( "()[]{}<>" ); function byId ( id ) { return document.getElementById( id ); } byId( "string" ).value = "<><(([]){}<[{{{{}}[[]]}}]>)>"; byId( "testme" ).onclick = function () { byId( "result" ).innerHTML = test( byId( "string" ).value ) ? "Valid" : "Invalid"; } </script> </body> |
Вариант для (){}[]
function balance(a) { for (var d = /(\u005B|\u0028|\u007B)[^\u005B\u0028\u007B]*?$/, e = { "(": /\u0028[^\u007D\u005D]*?\u0029/, "[": /\u005B[^\u0029\u007D]*?\u005D/, "{": /\u007B[^\u0029\u005D]*?\u007D/ }, b, c = !0; c;) b = a, a = a.replace(d, function (a, b) { return a.replace(e[b], "") }), b == a && (c = !1); return !/[\u005B\u005D\u0028\u0029\u007B\u007D]/.test(a) }; alert(balance("{}({}123(45))")+"\n"+balance("{}{}1234][5")+"\n"+balance("<><(([]){}<[{{{{}}[[]]}}]>)>")) |
рони,
Да ну, препод не поверит же.) |
Спасибо большое
уже сдала)))спасибо
|
теперь нужно преобразовать программу
Разбор числового выражения например: (((1+2)+3)*10-(3-1))/10= Если расстановка скобок верна, то выводить ответ, если нет-"ошибка" Решить через рекурсию. Подскажите как? |
var arr=[ '(((1+2)+3)*10-(3-1)))/10=', '(((1+2)+3)*10-(3-1))/10=', '(((1+)2)+3)*10-(3-1))/10=', '(((1+2()+3)*10-(3-1))/10=' ] function rep (a){ var c=a; var b=true; while (a.search(/[\(\)]/g)!= -1&&b) { a = a.replace(/\([^\(\)]+\)/g,'$');//alert(a) b = a.split(/\(|\)/).length!=2 && a.replace(/\(\)/g,'')==a; } if(b){b=eval(c.replace("=",""))} return b; } for(var i in arr){ alert('N='+i+'\n'+arr[i]+' ' +rep (arr[i]+';')); } |
Lesya,
Вариант... function balance(a) { var b; b = a; a = a.replace(/(\u0028)[^\u0028]*?$/, function (a) { return a = a.replace(/\u0028(.*?)\u0029/, function (a) { return eval(a) }) }); b != a && (a = balance(a)); return !/[\u0028\u0029]/.test(a) ? eval(a) : !1 }; alert(balance("(((1+2)+3)*10-(3-1))/10")+"\n"+balance("(((1+2)+3)*10)-(3-1))/10")) |
необходимо создать поле для ввода уравнения, т.е. уравнение не конкретно это, а вводим сами любое
|
Часовой пояс GMT +3, время: 20:36. |