Ao escrever código, às vezes encontramos situações em que precisamos analisar as quatro expressões aritméticas por nós mesmos. Este artigo apresenta brevemente o uso de JavaScript para implementar a análise de quatro expressões aritméticas simples.
1. Familiar com o conceito
A notação de infixo (ou notação de infixo) é um método geral de representação de fórmula aritmética ou lógica. O operador está no meio do operando na forma de um infixo (exemplo: 3 + 4). Ou seja, usamos as expressões aritméticas mais usadas. Expressões de infix são mais fáceis para os seres humanos entender, mas não são fáceis para a análise do computador.
A notação polonesa reversa (RPN, ou notação polonesa inversa) é um método de expressão matemática introduzido pelo matemático polonês Jan Vukasevich em 1920. Na notação polonesa inversa, todos os operadores são colocados atrás do operando, portanto também é chamada de notação do sufixo. A notação polonesa inversa não requer colchetes para identificar a prioridade do operador. A notação polonesa inversa é fácil de usar uma estrutura de pilha para analisar e calcular a expressão; portanto, aqui analisamos as quatro expressões de elementos, que primeiro se converte da expressão do infixo na expressão polonesa inversa. Em seguida, calcule o valor.
2. Processo de conversão
Converta uma expressão de infix em uma expressão de sufixo (algoritmo de campo de agendamento)
1. Entre na fila e coloque uma marca
2. Se a marca for um número, adicione -a à fila de saída
3. Se for um operador (+-*/), compare-o com o operador na parte superior da pilha na pilha de saída. Se a prioridade for menor ou igual ao operador na parte superior da pilha, coloque o operador na parte superior da pilha e adicione -a à fila de saída (loop até que as condições acima não sejam atendidas) e finalmente empurre o operador para a pilha.
4. Se for um suporte esquerdo, empurre -o na pilha
5. Se for um suporte próximo, o operador é constantemente retirado da pilha e adicionado à fila de saída, e sabe que o elemento na parte superior da pilha é o suporte esquerdo. O suporte esquerdo aparece e não adiciona a fila de saída. Se nenhum suporte esquerdo for encontrado, significa que os colchetes na expressão original são assimétricos e há um erro.
6. Se a fila de entrada estiver vazia e ainda houver operadores na pilha, se o operador na parte superior da pilha for esquerda, isso significa que a expressão original possui suportes incompatíveis. Retire os operadores na pilha, um por um, e adicione -os à fila de saída.
7. Concluído
3. Converter Código Implementação
função isoperator (value) {var operatorString = "+-*/()"; retorna operadores-resgate.indexof (value)> -1} função getPrioraty (value) {switch (value) {case '+': case '-': return 1; case '*: case'/': return 2; default:} 0; getPrioraty (O2);} função dal2rpn (exp) {var inputStack = []; var outputStack = []; var outputQueue = []; para (var i = 0, len = exp.Lurch; i <len; i ++) {var = exp [i]; se (cur! um'); while (inputStack.length> 0) {var cur = inputStack.shift (); if (isoperator (cur)) {if (cur == '(') {outputStack.push (cur);} else if (cur == ')) {var po = outputstack.pop (); while (po! = '(' && outputStack.length> 0) {outputQueue.push (po); po = outputStack.pop ();} if (po! 0) {outputQueue.push (outputStack.pop ());} outputStack.push (cur);}} else {outputQueue.push (novo número (cur); == '(') {Throw "Error: UMPLATED ()";} while (outputstack.length> 0) {outputQueue.push (outputstack.pop ());}} console.log ('etapa três'); return OutputQueue;} console.log (dal2rpn ('1 + 2'); 3 ')); console.log (dal2rpn (' 1 + 2 * 3 ')); console.log (dal2rpn (' 1 + 2 * 3 - 4/5 ')); console.log (dal2rpn (' (1 + 2)); 5 ')); console.log (dal2rpn (' (1 + 2) * ((3 - 4) / 5) '));4. Avaliação inversa de expressão polonesa
1. Coloque uma marca da fila de entrada
2. Se for um operando, adicione -o à pilha de saída
3. Se for um operador, coloque dois operandos da pilha de saída e calcule e empurre o valor calculado na pilha de saída.
4. Operação de loop. Se a fila de entrada estiver vazia e houver apenas um número na pilha de saída, esse número será o resultado, caso contrário, haverá um operando desnecessário.
5. Calcule o código
função Evalrpn (rpNqueue) {var outputStack = []; while (rpNqueue.Length> 0) {var CUR = rpNqueue.shift (); if (! isoperator (cur)) {outputstack.push (cur);} else {if (outputstack.Length <2) {touch outputStack.pop (); outputStack.push (getResult (Fir, sc, cur));}} if (outputStack.length! = 1) {Throw "Unvalid Expression";} else {return OutputStack [0];}}6. Conclusão
A representação polonesa inversa não está acostumada quando você entra em contato com ela, mas depois de se familiarizar com ela, você descobrirá que a idéia é realmente muito simples, diferentemente da representação do infix, que possui várias prioridades, e existem colchetes, que são lógicos particularmente problemáticos. A representação polonesa inversa é relativamente concisa e não há necessidade de considerar prioridade, e não há necessidade de usar colchetes, e suportes e aparelhos para interromper a situação.