588 Shares 8639 views

RPN: Algoritmo, métodos e exemplos

RPN formada uma vez que a base de um programador de computador no mundo. Hoje não é tão bem conhecido. Portanto, ilustração cómica, que descreve um "reverso" rolos de salsicha polonesa fora, ainda pode ser mal interpretado por alguns programadores experientes. Não muito bem explicar a piada, mas neste caso será plenamente justificada.

infixo

Todos os programadores, e a maioria dos estudantes estão familiarizados com o uso de operadores. Por exemplo, os valores de expressão de soma x + para as variáveis x e y sinal de adição utilizado. Menos conhecido é o fato de que este é emprestado da matemática notação, chamada notação infix, na verdade, é um grande problema para as máquinas. Este operador recebe como dois valores de entrada são gravados no lado esquerdo e direito. Na programação notação utilizada opcionalmente com operações de sinais. Por exemplo, x + y pode ser escrito como uma função de dobragem (x, y), em que o compilador e, eventualmente, se converte notação infixa. No entanto, todos sabem a matemática é bom demais para não usar expressões aritméticas, que formam uma espécie de mini-linguagem interna em quase todas as linguagens de programação.

fórmula tradutor

A primeira linguagem de programação Fortran realmente bem sucedido tornou-se tão grande parte porque a expressão aritmética (ie fórmula ..) É convertido (broadcast) no código, daí o nome dela – fórmula de conversão de. Antes disso, eles tiveram de escrever, por exemplo, dobrado em forma de funções (e multiplicar (b, c)). Em problema COBOL de implementar fórmula de conversão automática foi considerado muito difícil porque os programadores tinham de escrever coisas como Adicione ao B Mutliply por C.

O que está errado com infix?

O problema é, que os operadores têm propriedades tais como a precedência e associatividade. Devido a isso, a definição da função infix torna-se tarefa não trivial. Por exemplo, a multiplicação tem precedência mais elevada do que a adição ou subtracção, o que significa que a expressão 2 + 3 * 4 não é igual à soma de 2 e 3, multiplicado por 4, como seria no desempenho dos operadores da esquerda para a direita. Na verdade, multiplicar 3 por 4 e adicione 2. Este exemplo ilustra que o cálculo da expressão infix muitas vezes requer uma mudança na ordem dos operadores e operandos. Além disso, é necessário usar chaves para olhar notação mais clara. Por exemplo, (2 + 3) * (4 + 5) não pode ser escrita sem os parênteses, porque 2 + 3 * 4 + 5 significa que você precisa multiplicar 3 por 4 e adicionar 2 e 5.

A ordem em que você deseja calcular os operadores exige um longo lembrar. Devido a isso, os estudantes que começam a aprender aritmética, muitas vezes obter os resultados errados, mesmo que as operações reais são executadas corretamente. É necessário ensinar a ordem das declarações de ação de cor. Em primeiro lugar, a acção deve ser realizada em parênteses, em seguida, multiplicação e divisão, e, finalmente, adição e subtração. Mas há outra maneira de escrever expressões matemáticas como notação infix é apenas uma das possíveis "línguas pequenas" que podem ser adicionados a mais.

notação de prefixo e postfix

Duas das alternativas mais conhecidas é gravar o operador antes ou depois de seus operandos. Eles são conhecidos como a notação de prefixo e sufixo. Logician Yan Lukasevich inventou a primeira em 1920. Ele viveu na Polônia, assim que o registro é chamado polonês. versão Postfix, respectivamente, chamado Reverse Polish Notation (ARF). A única diferença entre estes dois métodos é a direção na qual a ler o registro (da esquerda para a direita ou da direita para a esquerda), então basta considerar em detalhes apenas um deles. O operador OPN está escrito após seus operandos. Assim, a expressão AB + representa um exemplo para RPN A + B.

número ilimitado de operandos

A vantagem imediata de notação é que ele resume o operador n-adic e notação infix é realmente só funciona com dois operandos, t. E. são inerentemente adequado apenas para operações binárias. Por exemplo, a ABC @ é a expressão polaca reversa utilizando marca ternário que é o valor máximo de A, B e C. Neste caso, o operador actua sobre o lado esquerdo do três operando em si e corresponde a uma chamada de função @ (A, B, C). Se você tentar escrever o símbolo @ como infix, como A @ BC ou algo assim, torna-se claro que ele simplesmente não funciona.

A prioridade dada pela ordem

RPN tem outra vantagem em que a prioridade dos operadores pode ser representada pela ordem em que aparecem. Ao mesmo tempo, nunca precisa chaves, embora possam ser incluídos como operações de caracteres para facilitar a conversão de notação infix. Por exemplo, AB + C * – equivalente inequívoca (A + B) * C, de modo que a multiplicação não pode ser calculado, até a adição efectuada, o que dá um segundo operando para multiplicação. Ou seja, se o calculado AB + C * por um operador de cada vez, temos AB + C * -> (AB +) * C -> (A + B) * C.

algoritmo de cálculo

O operador OPN é a mesma de uma função que toma como argumentos dois valores escrito em seu lado esquerdo. Além disso, é uma notação natural para uso em linguagens de programação, tal como o modo do seu cálculo corresponde às operações de pilha e a necessidade de análise é eliminado. Por exemplo, o pára-raios na expressão 5 + 6 * 7 vai aparecer como um 5, 6, 7 *, +, e pode ser calculada simplesmente fazendo a varredura da esquerda para a direita e escrever os valores em uma pilha. Sempre que um sinal comum de operação, selecionado pelo elemento superior 2 da memória do computador, o operador é utilizado e o resultado retornado para a memória. Quando o resultado final da expressão de cálculo será no topo da pilha.

Por exemplo:

  • S = () 5, 6, 7, *, + 5 colocado na pilha.
  • S = (5) 6, 7, *, + 6 colocado na pilha.
  • S = (5, 6), 7 *, 7 + colocar a pilha.
  • S = (5, 6, 7), * 2 + escolher valores da pilha, uso * e colocar o resultado na pilha.
  • S = (5, 6 * 7) = (5, 42) + 2 valores seleccionados a partir da pilha, para aplicar a + e colocar o resultado na pilha.
  • S = (5 + 42) = (47) de cálculo está concluída, o resultado é armazenado na parte superior da pilha.

Este algoritmo pode ser verificado RPN repetidamente, mas cada vez que ele vai trabalhar, não importa o quão complexa é a expressão aritmética.

OPN e pilhas estão intimamente ligados. Este exemplo demonstra como usar a memória para calcular o valor da notação polonesa reversa. Menos óbvio é que você pode usar a pilha, converter expressão infix padrão em insuficiência renal aguda.

Exemplos de linguagens de programação

Pascal RPN percebeu assim (mostra a parte do programa).

Para ler os números e operadores no ciclo chamado procedimento, que determina se o número ou sinal operação token. No primeiro caso, o valor armazenado na pilha, e o segundo dos dois números superiores da pilha de acção correspondente é realizada e o resultado é armazenado.

toktype: = num;

lido (s);

se c em [ '+', '-', '*', '/'], em seguida, começar

se eoln então cn: = '' else ler (cn);

se cn = '', em seguida,

caso de um

'+': Toktype: = adicionar; '-': toktype: = sub;

'*': Toktype: = mul; '/': Toktype: = div

final

else begin

se a = '-' então sgn: = -1 erro outra coisa: = c '+';

com: = cn

final

acabar;

se (não erro) e (toktype = NUM), em seguida, getNumber;

se toktype NUM então começar

y = pop; x: = pop;

se não erro, em seguida,

caso toktype de

adicionar: z: = x + y; sub: z: = x-y; mul: z: = x * y; div: z: = x / y

final

empurrão (z);

RPN-implementação C (parte do programa mostrado):

para (s = strtok (s, w); s; s = strtok (0, w)) {

a = strtod (s, & E);

if (e> s) push (a);

#define rpnop (x) printf ( "% c:", * s), b = pop (), um pop = (), de pressão (x)

else if (* s == '+') rpnop (a + b);

else if (* s == '-') rpnop (a – b);

else if rpnop (* s == '*') (a * b);

else if rpnop (s * == '/') (a / b);

rpnop #undef

}

implementações de hardware

Naqueles dias, quando a tecnologia de computador era muito caro, pensava-se uma boa idéia para forçar as pessoas a usar pára-raios. Em 1960-s., Como agora, era possível comprar as calculadoras, que trabalham na notação polonesa reversa. Para adicionar 2 e 3 deles deve entrar 2, depois 3, e pressione o botão "plus". À primeira vista, os operandos de entrada para o operador parecia complicado e difícil de lembrar, mas depois de um tempo alguns são viciado a este modo de pensar e não conseguia entender por que os outros insistem em infix estúpido, que é tão complicado e por isso é limitado.

empresa Burroughs mesmo construiu um mainframe, que não tinha outra memória, exceto pilha. A única coisa que faz a máquina – aplicada a algoritmos e métodos RPN à pilha central. Todas as operações foram considerados operadores pára-, que se aplica para os n valores superiores. Por exemplo, a equipe levou o retorno de endereço a partir do topo da pilha, e assim por diante. D. A arquitetura de tal máquina era simples, mas não rápido o suficiente para competir com as arquiteturas mais comuns. Muitos, no entanto, ainda lamentar o fato de que uma abordagem tão simples e elegante para a computação onde cada programa era uma expressão de OPN, encontrou a sua continuação.

Um calculadoras de tempo com RPN eram populares, e algumas pessoas ainda dar-lhes preferência. Além disso, eles desenvolveram uma orientada a pilha linguagens, como Forth. Hoje é pouco utilizado, mas ainda nostálgica dos seus antigos usuários.

Então o que é que as piadas significado cerca de salsicha polonesa reversa?

Se assumirmos que o operador da salsicha, a notação infix, ele deve estar dentro do rolo como em cachorro-quente convencional. A RPN está localizado em duas metades obter entre elas prontas após o cálculo. Agora vem a parte difícil – mostarda. Ela já está na salsicha, t. E. Já calculado como um operador unário. Acredita-se que a mostarda também deve ser mostrado como uncalculated e, portanto, deve ser deslocado para a direita da salsicha … Mas é possível, isso exigiria muito grande pilha de …