InFix to Postfix Conversion

1

I have to convert an InFix value to Postfix

Examples:

Theproblemofmyalgorithmispreciselyinthislastline....Ibelievethattheproblemisinexpressionswith+2termswithintheparenthesis,oftype:(X*Y+Z)

Honestly,Ihavedebuggedthecodeseveraltimes,IhavechangedittoseveralversionsandIstillcannotfix.....anysuggestions?

FOLLOWTHEFULLCODE:

functionoperando(caracter){varregex=/^[a-zA-Z]+$/;if(regex.test(caracter)){returntrue;}else{returnfalse;}}functionoperador(caracter){varregex=/^[*+-–/^]+$/gi;if(regex.test(caracter)){returntrue;}else{returnfalse;}}functionobterPrioridade(caracter){varretorno=0;varregex1=/^[+-–]+$/gi;varregex2=/^[*/]+$/gi;if('('==caracter){retorno=1;}elseif(regex1.test(caracter)){retorno=2;}elseif(regex2.test(caracter)){retorno=3;}elseif('^'==caracter){retorno=4;}returnretorno;}functiontransformar(){//ConverteumaexpressãodaformaInfixanaformaPosfixa.SeguealógicaexplicaanteriormentenaintroduçãosobreexpressõesvararrayDeCaracteres=document.getElementById("expressao").value;
    var pilha = [];
    var prioridade = 0;
    var caracter = ""; var resultado = "";

    //Varre todos os elementos da expressão de entrada e, para cada elemento, verifica se é operador ou operando. Se for operando, já adicona a saída
    for(i = 0; i < arrayDeCaracteres.length; i++){
        caracter = arrayDeCaracteres.charAt(i);

        if(operando(caracter)){
            resultado += caracter;
        }else if(operador(caracter)){
            prioridade = obterPrioridade(caracter);
            aux = pilha.pop();
            prioridade2 = obterPrioridade(aux);
            //alert('Caracter: '+caracter+'\n'+prioridade+'\nAux: '+aux+'\n'+prioridade2);
            pilha.push(aux);
            if(typeof aux === 'undefined'){
            }else{
                while((pilha.length > 1) && (prioridade2 >= prioridade)){
                    resultado += pilha.pop();
                }
            }
            pilha.push(caracter);
        }else if('(' === caracter){
            //Insere o objeto no topo da pilha
            pilha.push(caracter);
        }else if(')' === caracter){
            var item = pilha.pop();
            while ((item != '(') && (item != undefined)){
                resultado += item;
                //Recupera e remove o objeto do topo da pilha
                item = pilha.pop();
            }
        }
    }

    while(pilha.length > 1){
        resultado += pilha.pop();
    }

    console.log(resultado);
}

I believe the logic error is in this section:

        }else if(')' === caracter){
            var item = pilha.pop();
            while ((item != '(') && (item != undefined)){
                resultado += item;
                //Recupera e remove o objeto do topo da pilha
                item = pilha.pop();
            }
        }
    
asked by anonymous 16.12.2014 / 13:20

1 answer

3

It's a pretty simple mistake that let go. There is nothing wrong with the code or the algorithm itself, it works. The error is in regular expressions.

As you have used in the operando function, you can write [A-Z] to denote all characters between A and Z . The problem is when you write something like this: /^[*+-–/^]+$/ .

Notice there: [+-–] . This is capturing a whole string of characters between + and . The solution in this case is to move - (less) to the end, or to the beginning.

Thus: /^[-*+–/^]+$/ . The same happens in the obterPrioridade function.

I tested it and with that simple change the code works.

    
16.12.2014 / 17:11