1. O que é polimento reverso?
A notação polonesa reversa, também conhecida como notação polonesa reversa (RPN), é um método usado em matemática e ciência da computação para representar expressões aritméticas. Sua característica é que o operador fica atrás do operando, não havendo necessidade de parênteses para alterar a prioridade da operação.
Por exemplo, a expressão aritmética que normalmente escrevemos é “2 + 3”. Na notação polonesa reversa, esta expressão seria escrita "2 3 +".
Uma grande vantagem da notação polonesa reversa é que ela elimina parênteses nas expressões e torna mais explícita a ordem em que as operações são executadas. Na ciência da computação, a notação polonesa reversa permite uma avaliação mais simples e eficiente das expressões. Por exemplo, expressões polonesas reversas podem ser facilmente avaliadas usando a estrutura de dados da pilha.
A notação polonesa reversa recebeu o nome do lógico polonês Jan Łukasiewicz. Enquanto sua "notação polonesa" original coloca o operador antes do operando (como "+ 2 3"), a "notação polonesa reversa" coloca o operador após o operando, o que facilita o uso prático, especialmente na ciência da computação.
Vejamos alguns exemplos de notação polonesa reversa (RPN). Aqui estão algumas expressões aritméticas comuns e suas representações polonesas reversas correspondentes:
Expressão regular: (7 - 4) * 2, representação RPN correspondente: 7 4 - 2 *
Explicação: Subtraia 4 de 7 e multiplique o resultado por 2.
Expressão regular: 5 + ((1 + 2) * 4) - 3, representação RPN correspondente: 5 1 2 + 4 * + 3 -
Explicação: Primeiro faça 1+2, depois multiplique o resultado por 4, depois some a 5 e, finalmente, subtraia 3 dele.
Expressão regular: (3 + 4) * (5 * 6), representação RPN correspondente: 3 4 + 5 6 * *
Explicação: Primeiro execute 3+4 e execute simultaneamente 5*6 e depois multiplique os dois resultados.
2. Calcule de acordo com a fórmula polonesa reversa
Este é um exemplo simples de calculadora Reverse Polish (RPN) implementada em Java. Esta calculadora pode lidar com expressões RPN que consistem em quatro operações aritméticas básicas.
import java.util.Stack;
public class RPNCalculator {
public static int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (String token : tokens) {
switch (token) {
case "+": //但是符号时,就进行运算
stack.push(stack.pop() + stack.pop()); //取出当前栈里面的2个元素,进行运算后,再push进去
break;
case "-":
stack.push(-stack.pop() + stack.pop());
break;
case "*":
stack.push(stack.pop() * stack.pop());
break;
case "/":
int n1 = stack.pop(), n2 = stack.pop();
stack.push(n2 / n1);
break;
default: // 如果是普通字符,则直接入栈
stack.push(Integer.parseInt(token));
}
}
return stack.pop();
}
public static void main(String[] args) {
String[] rpnExpression = {
"2", "1", "+", "3", "*"};
System.out.println(evalRPN(rpnExpression));
}
}
Neste exemplo, a função evalRPN aceita uma matriz de strings, cada uma representando um elemento (um número ou um operador) na expressão RPN. Em seguida, ele usa uma pilha para armazenar e manipular números.
Para cada elemento, verifica se se trata de um operador ("+", "-", "*" ou "/"). Nesse caso, ele retira dois elementos da pilha, executa a operação apropriada e, em seguida, coloca o resultado de volta na pilha. Se o elemento for um número, ele o coloca na pilha.
Após todos os elementos terem sido processados, o elemento no topo da pilha é o resultado da expressão.
Na função principal, criamos uma matriz de strings de expressão polonesa reversa {"2", "1", "+", "3", "*"}, que é equivalente à expressão regular (2+1 )*3 , então chamamos a função evalRPN para calculá-lo. O resultado do cálculo será impresso.
Tome 3+4 como exemplo para analisar, a forma polonesa correspondente é 3 4 +:
1) De acordo com a forma polonesa, empurre para dentro da pilha
2) Após pressionar, retire os elementos da pilha de cima para baixo, geralmente o a camada superior deve ser um Operador
Quando o símbolo de operação é retirado da pilha, os 2 elementos a seguir serão retirados, operados e colocados na pilha.
Depois que o sinal + for retirado, 4 será retirado e então 3 é retirado e a operação é executada para obter 7 e então colocada na pilha
O estado da pilha neste momento:
3) Continue a empurrar os formulários poloneses subsequentes para a pilha, pressionando os números 5, 6 e * em sequência
4)
Continue a empurrar os formulários poloneses subsequentes para a pilha, pressionando 5, 6, e * números em sequência
Quando a camada superior da pilha é um símbolo, as operações precisam ser executadas novamente. Retire os 2 elementos a seguir e execute as operações.
5*6=30, coloque 30 na pilha
O estado da pilha neste momento:
5) Continue a enviar o conteúdo em polonês, que é o último sinal *
30*7 + 210
3. Como converter expressões comuns para a forma polonesa reversa
Como (3 + 4) * (5 * 6) se transforma em 3 4 + 5 6 * *?
Sabemos que A + B precisa ser classificado em: AB + Então o mesmo vale para fórmulas complexas, podemos considerar A como uma expressão (3+4), que é fácil de entender.
Em seguida, a ordem de processamento (3 + 4) * (5 * 6):
1) Converta primeiro o módulo grande (3 + 4) (5 * 6) *
1) Substitua 3 + 4 na etapa 1 por 3 4 +
2) Substitua 5 * 6 na etapa 1 por 5 6 *
3) Obtenha o 3 4 + 5 6 *** final
Nota :上面的是代数思想,不是计算机的处理方式,如过想写个程序进行计算,那么需要从左至右进行处理,基本原理和RPNCalculator 类似,只不过是反着写