Постфиксная запись. Если в скобках больше двух операндов
В книге Лафоре раcсматривается пример A + B x (C - D). Должно быть ABCD-x+ С этим получилось. Но с примером A + B x (C - D + E) что-то не ладится... В чем причина? Или хотя бы алгоритм подсказать можно. А то в книге этот случай пошагово не рассматривается
ops = {'+':1,
'-':1,
'/':2,
'*':2
};
s = '1+2*(3-4+5)'.split('');
//s = '1+2*(3-4)'.split('');
stack = [];
out = '';
for (var i = 0; i < s.length; i++) {
if(!isNaN(s[i])){
out += s[i];
}
if(isNaN(s[i])){
a = stack[stack.length - 1];
if(stack.length == 0) {stack.push(s[i])}
else {
if (s[i] == '(' || a == '(') {stack.push(s[i])}
if(ops[a] >= ops[s[i]]) {
out += a;
console.log('operator', s[i],'add ' + a);
console.log('stack before pop', stack);
stack.pop();
console.log('stack after pop and before push', stack);
//выталкиваем из стека в строку
while(stack.length > 0) {
out += stack[stack.length - 1];
stack.pop();
}
//выталкиваем из стека в строку
stack.push(s[i]);
console.log('stack after push', stack);
}
if(ops[a] < ops[s[i]]) {
console.log('элемент ' +s[i] + ' > ' + ' кон. стека ' + a);
stack.push(s[i]);
}
// закрывающая скобка
if(s[i] == ')') {
console.log('element', s[i],'stack:', stack);
while(stack[stack.length - 1] != '(') {
out += stack[stack.length - 1];
stack.pop();
}
stack.pop();
}
// закрывающая скобка
}
}
console.log(s[i],'out',out, 'stack', stack);
}
if (stack.length != 0) {
while(stack.length > 0) {
out += stack[stack.length - 1];
stack.pop();
}
}
console.log('out is',out);
/*
1 out 1 stack []
+ out 1 stack ["+"]
2 out 12 stack ["+"]
* > кон. стека +
* out 12 stack (2) ["+", "*"]
( out 12 stack (3) ["+", "*", "("]
3 out 123 stack (3) ["+", "*", "("]
- out 123 stack (4) ["+", "*", "(", "-"]
4 out 1234 stack (4) ["+", "*", "(", "-"]
operator + add -
stack before pop (4) ["+", "*", "(", "-"]
stack after pop and before push (3) ["+", "*", "("]
stack after push ["+"]
+ out 1234-(*+ stack ["+"]
5 out 1234-(*+5 stack ["+"]
) stack: ["+"]length: 0[[Prototype]]: Array(0)
Uncaught RangeError: Invalid string length
*/