Informática, Software
RPN: Algoritmo, métodos e exemplos
RPN formada unha vez que a base de un programador de ordenador no mundo. Hoxe non é tan ben coñecido. Polo tanto, ilustración cómica, que describe un "reverso" rolos de salchicha polaca fóra, aínda pode ser mal interpretado por algúns programadores experimentados. Non moi ben explicar a broma, pero neste caso será plenamente xustificada.
infixo
Todos os programadores, ea maioría dos estudantes están familiarizados co uso de operadores. Por exemplo, os valores de expresión de suma x + para as variables x e y signo máis utilizado. Menos coñecido é o feito de que este é prestado da matemática notación, chamada notación infix, en realidade, é un gran problema para as máquinas. Este operador recibe como dous valores de entrada son gravados no lado esquerdo e dereito. Na programación notación empregada opcionalmente con operacións de sinais. Por exemplo, x + y pode ser escrito como unha función de dobraxe (x, y), no que o compilador e, finalmente, convértese notación infixa. Con todo, todo o mundo sabe a matemática é bo de máis para non usar expresións aritméticas, que forman unha especie de mini-linguaxe interna en case todas as linguaxes de programación.
fórmula tradutor
A primeira linguaxe de programación Fortran realmente exitoso tornouse tan gran parte porque a expresión aritmética (ie fórmula ..) e convertido (broadcast) no código, de aí o seu nome - fórmula de conversión de. Antes diso, eles tiveron que escribir, por exemplo, dobrado en forma de funcións (e multiplicar (b, c)). En problema COBOL de aplicar fórmula de conversión automática foi considerado moi difícil porque os desenvolvedores tiñan que escribir cousas como Engadir ao B Mutliply por C.
O que está mal co infix?
O problema é que os operadores teñen propiedades como a precedencia e associatividade. Debido a iso, a definición da función infix convértese en tarefa non trivial. Por exemplo, a multiplicación ten precedencia máis elevada que a suma ou a resta, o que significa que a expresión 2 + 3 * 4 non é igual á suma de 2 e 3, multiplicado por 4, como sería o desempeño dos operadores de esquerda a dereita. De feito, multiplicar 3 por 4 e engade 2. Este exemplo ilustra o cálculo da expresión infix miúdo require un cambio na orde dos operadores e operandos. Ademais, é necesario utilizar claves para ollar notación máis clara. Por exemplo, (2 + 3) * (4 + 5) non pode ser escrita sen os parénteses, porque 2 + 3 * 4 + 5 significa que precisa multiplicar 3 por 4 e engadir 2 e 5.
A orde en que quere calcular os operadores esixe moito lembrar. Debido a iso, os estudantes que comezan a aprender aritmética, moitas veces obter os resultados errados, aínda que as operacións reais son executados correctamente. Cómpre ensinar a orde das declaracións de acción de cor. En primeiro lugar, a acción debe ser realizada en parénteses, a continuación, multiplicación e división, e, finalmente, adición e subtracción. Pero hai outra forma de escribir expresións matemáticas como notación infix é só unha das posibles "linguas pequenas" que poden ser engadidos a máis.
notación de prefixo e Postfix
Dúas das alternativas máis coñecidas é gravar o operador antes ou despois dos seus operandos. Son coñecidos como a notación de prefixo e sufixo. Logician Yan Lukasevich inventou o primeiro en 1920. El viviu en Polonia, así que o rexistro é chamado polaco. versión Postfix, respectivamente, chamado Reverse Polish Notation (ARF). A única diferenza entre estes dous métodos é a dirección na cal a ler o rexistro (de esquerda a dereita ou de dereita a esquerda), entón só tes que considerar en detalle só un deles. O operador OPN escrito tras os seus operandos. Así, a expresión AB + representa un exemplo para RPN A B.
número ilimitado de operandos
A vantaxe inmediata de notación é que reduce o operador n º e notación infix é realmente só funciona con dous operandos, t. E. son inherentemente axeitado só para operacións binarias. Por exemplo, a ABC @ é a expresión polaca inversa utilizando marca ternário que é o valor máximo de A, B e C. Neste caso, o operador actúa sobre o lado esquerdo do tres operando en si e corresponde a unha chamada de función @ (A, B, C). Se tentar escribir o símbolo @ como infix, como A @ BC ou algo así, torna-se claro que simplemente non funciona.
A prioridade dada pola orde
RPN ten outra vantaxe en que a prioridade dos operadores pode ser representada pola orde en que aparecen. Ao mesmo tempo, nunca ten chaves, aínda que poidan ser incluídos como operacións de caracteres para facilitar a conversión de notación infix. Por exemplo, AB + C * - equivalente inequívoca (A + B) * C, de xeito que a multiplicación non pode ser calculado, ata a incorporación efectuada, o que dá unha segunda operando para multiplicación. É dicir, se o calculado AB + C * por un operador de cada vez, temos AB + C * -> (AB +) * C -> (A + B) * C.
algoritmo de cálculo
O operador OPN é o mesmo de unha función que toma como argumentos dous valores escrito no seu lado esquerdo. Ademais, é unha notación natural para uso en linguaxes de programación, como o modo do seu cálculo corresponde ás operacións de pila ea necesidade de análise é eliminado. Por exemplo, o pararraios na expresión 5 + 6 * 7 aparecerá como un 5, 6, 7 *, +, e pode ser calculada simplemente facendo a exploración de esquerda a dereita e escribir os valores nunha pila. Sempre que un sinal común de operación, seleccionado polo elemento superior 2 da memoria do ordenador, o operador é utilizado eo resultado retorno para a memoria. Cando o resultado final da expresión de cálculo será na parte superior da pila.
Por exemplo:
- S = () 5, 6, 7, *, + 5 colocado na pila.
- S = (5) 6, 7, *, + 6 colocado na pila.
- S = (5, 6), 7 *, 7 + poñer a pila.
- S = (5, 6, 7), * 2 + escoller valores do conxunto, uso * e poñer o resultado na pila.
- S = (5, 6 * 7) = (5, 42) + 2 valores seleccionados a partir do conxunto, para aplicar a + e poñer o resultado na pila.
- S = (5 + 42) = (47) de cálculo está rematada, o resultado é almacenado na parte superior do conxunto.
Este algoritmo pode ser verificado RPN repetidamente, pero cada vez que vai traballar, non importa o quão complexo é a expresión aritmética.
OPN e pilas están intimamente ligados. Este exemplo demostra como usar a memoria para calcular o valor da notación polaca inversa. Menos evidente é que pode usar a pila, converter expresión infix estándar en insuficiencia renal aguda.
Exemplos de linguaxes de programación
Pascal RPN entendeu así (mostra a parte do programa).
Para ler os números e operadores no ciclo chamado procedemento, que determina o número ou signo operación token. No primeiro caso, o valor almacenado na pila, eo segundo dos dous números superiores da pila de acción correspondente se realiza eo resultado é almacenado.
toktype: = nun;
ler (s);
se c en [ '+', '-', '*', '/'], a continuación, comezar
se eoln entón cn: = '' else ler (CN);
se cn = '', logo
caso dun
'+': Toktype: = Engadir; '-': toktype: = sub;
'*': Toktype: = mul; '/': Toktype: = div
final
Else begin
a = '-' entón sgn: = -1 erro outra cousa: = c <> '+'
con: = CN
final
acabar;
(non erro) e (toktype = NUM), a continuación, getNumber;
se toktype <> NUM entón comezar
y = pop; x: = pop;
se non erro, logo
caso toktype de
Engadir: z: = x + y, sub: z: = x-y; mul: z: = x * y, div: z: = x / y
final
pulo (z);
RPN-implantación C (parte do programa móstrase):
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 (), un pop = (), de presión (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
}
implementacións de hardware
Naqueles días, cando a tecnoloxía de ordenador era moi caro, pensaba-se unha boa idea para facer a xente a usar pararraios. En 1960-s., Por exemplo, era posible mercar as calculadoras, que traballan na notación polaca inversa. Para engadir 2 e 3 deles debe entrar 2, despois 3, e prema o botón "plus". A primeira vista, os operandos de entrada ao operador parecía complicado e difícil de lembrar, pero despois dun tempo algúns son adicto a este modo de pensar e non podía entender por que os outros insisten en infix estúpido, que é tan complicado e por iso é limitado.
empresa Burroughs mesmo construíu un Exposicións, que non tiña outra memoria, excepto pila. O único que fai a máquina - aplicado a algoritmos e métodos RPN á pila central. Todas as operacións foron considerados operadores para-, que se aplica para os n valores superiores. Por exemplo, o equipo levou a volta de dirección dende o principio da pila, e así por diante. D. A arquitectura de tal máquina era simple, pero non rápido o suficiente para competir coas arquitecturas máis comúns. Moitos, con todo, aínda lamentar o feito de que unha visión tan simple e elegante para a computación onde cada programa era unha expresión de OPN, atopou a súa continuación.
Un calculadoras de tempo con RPN eran populares, e algunhas persoas aínda darlles preferencia. Ademais, eles desenvolveron unha orientada a pila linguaxes, como Forth. Hoxe é pouco utilizado, pero aínda nostálgica dos seus antigos usuarios.
Entón o que é que as bromas significado uns salchicha polaca inversa?
Se asumimos que o operador de salchicha, a notación infix, debe estar dentro do rolo como cachorro-quente convencional. A RPN reside en dúas metades obter entre elas preparadas tras o cálculo. Agora vén a parte difícil - mostaza. Ela xa está na salchicha, t. E. Xa calculado como un operador unário. Crese que a mostaza tamén debe ser mostrado como uncalculated e, polo tanto, debe ser desprazado á dereita da salchicha ... Pero é posible, iso esixe moito gran pila de ...
Similar articles
Trending Now