Постфиксная запись. Если в скобках больше двух операндов

В книге Лафоре ра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
     */

Ответы (0 шт):