Баланс открывающихся и закрывающихся скобок.Стеки в 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"))
|
необходимо создать поле для ввода уравнения, т.е. уравнение не конкретно это, а вводим сами любое
|
помогите, пожалуйста
|
|
<pre>
(((1+2)+3)*10-(3-1)))/10
(((1+2)+3)*10-(3-1))/10
</pre>
<br />
<span id="result"> </span><p><input type="text" name="l" id="rad1"><input type="button" onclick="rep()" value="Подсчитать"/></p>
<script type="text/javascript">
function rep (){
var a = document.getElementById('rad1').value;
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("=",""));}
document.getElementById('result').innerHTML=b;
}
</script>
|
| Часовой пояс GMT +3, время: 20:37. |