333 Shares 1006 views

RPN: algorytmów, sposoby i przykłady

RPN kiedyś stanowiły podstawę programisty komputerowego na świecie. Dziś to nie jest tak dobrze znany. Dlatego comic ilustracji, przedstawiających „reverse” polskie kiełbasy rolkach na zewnątrz, nadal może być źle zrozumiane przez niektórych doświadczonych programistów. Niezbyt dobrze wytłumaczyć żart, ale w tym przypadku będzie to w pełni uzasadnione.

infiks

Wszyscy programiści, a większość studentów są zaznajomieni z wykorzystaniem operatorów. Na przykład, wyrażenie x + wartości sumowania dla zmiennych x i y są używane znak plus. Mniej znany jest fakt, że jest to zapożyczone z notacji matematycznej, zwanej notacja infiksowa, w rzeczywistości jest to duży problem dla maszyn. Ten operator odbiera na wejściu dwie wartości są zapisywane na lewo i prawo. W programowaniu notacja stosowane opcjonalnie z operacji znaki. Na przykład, suma x + y może być zapisane jako funkcję zagięcia (x, y), gdzie kompilator i ewentualnie przetwarza zapis Infix. Jednak każdy wie, że matematyka jest zbyt dobry, aby nie używać wyrażeń arytmetycznych, które tworzą rodzaj wewnętrznego mini-język, w prawie każdym języku programowania.

formuła tłumacz

Pierwszym naprawdę udany języka programowania Fortran stało się tak w dużej mierze dlatego, że wyrażenie arytmetyczne (tj formuła ..) Jest Budynek (Broadcast) w kodzie, stąd nazwa to – formuła tłumaczenie. Wcześniej, mieli do pisania, na przykład, składana w postaci funkcji (i wielowarstwowy (b, c)). W problemu COBOL realizacji automatycznego wzoru konwersji uznano za bardzo trudne, ponieważ programiści musieli napisać takie rzeczy jak dodać do B Mutliply przez C.

Co jest nie tak z wrostkiem?

Problem polega na tym, że operatorzy mają takie właściwości jak pierwszeństwa i skojarzeń. Z tego powodu, definicja funkcji Infix staje nietrywialne zadanie. Na przykład, mnożenie ma wyższy priorytet niż dodawanie lub odejmowanie, co oznacza, że ekspresja 2 + 3 * 4 jest równa sumie od 2 do 3, pomnożonej przez 4, jak to będzie w wykonywaniu operatorów od lewej do prawej. W rzeczywistości, należy pomnożyć przez 3, 4 i dodać 2. Ten przykład ilustruje, że obliczenie wyrażenia Infix często wymaga zmiany kolejności operatorów i operandów. Ponadto, konieczne jest użycie nawiasów aby wyglądać bardziej wyraźny zapis. Na przykład, (2 + 3) * (4 + 5) nie może być zapisany bez nawiasów, bo 2 + 3 * 4 + 5 oznacza, że trzeba pomnożyć przez 3, 4 i dodać 2 i 5.

Kolejność, w jakiej chcesz obliczyć operatorów wymaga długo pamiętać. Z tego powodu studenci, którzy zaczynają uczyć się arytmetyki, często dostać złe rezultaty, nawet jeśli rzeczywiste operacje są wykonywane prawidłowo. Konieczne jest, aby nauczyć kolejność wypowiedzi działania na pamięć. Po pierwsze, działanie musi być przeprowadzane w nawiasach, a następnie mnożenie i dzielenie, a na końcu dodawanie i odejmowanie. Ale istnieje inny sposób pisania wyrażeń matematycznych jako notacja infiksowa jest tylko jednym z możliwych „małych języków”, które mogą być dodawane do innych.

notacja przedrostek i przyrostek

Dwa z najbardziej znanych alternatyw jest zapis operatora przed lub po jej argumentów. Są one znane jako notacji przedrostkiem i przyrostkiem. Logik Yan Lukasevich wynalazł pierwszy w 1920 roku. Żył w Polsce, więc zapis jest nazywany polskim. Wersja Postfix, odpowiednio, zwany Odwrotna Notacja Polska (ARF). Jedyna różnica pomiędzy tymi dwoma metodami jest to kierunek, w którym przeczytać rekord (od lewej do prawej lub od prawej do lewej), więc wystarczy rozważyć szczegółowo tylko jeden z nich. Operator OPN jest napisane po jego argumentów. Tak więc, wyrażenie AB + przedstawia przykład RPN dla A + B.

Nieograniczona liczba argumentów

Bezpośrednim zaletą jest to, że zapis podsumowuje operatora n-adyczne i oznaczenie infiks naprawdę działa tylko z dwóch argumentów, t. E. są nieodłącznie nadaje się tylko do operacji binarnych. Na przykład ABC @ jest odwrotna Polskiej wyrażeniu triadycznych znacznik, który jest wartością maksymalną z A, B i C. W tym przypadku, operator oddziałuje na lewo od trzech samego argumentu i odpowiada na wywołanie funkcji @ (A, B, C). Jeśli próbujesz zapisać jako symbol @ wrostkiem, takim jak @ BC czy coś takiego, to staje się jasne, że to po prostu nie działa.

Priorytet w kolejności

RPN ma jeszcze jedną zaletę, że priorytetem operatorów może być reprezentowany przez kolejności ich pojawienia się. Jednocześnie nigdy nie trzeba szelki, chociaż mogą być zawarte jako znaki w celu ułatwienia operacji konwersji z notacji Infix. Na przykład, AB + C * – jednoznaczny równoważnik (A + B) * C, a więc nie może zostać mnożenie obliczane do sumowania przeprowadzanego, co daje drugi argument operacji mnożenia. Oznacza to, że jeżeli obliczona AB + C * od jednego operatora w czasie, otrzymujemy AB + C * -> (AB +) * C -> (A + B) * C

algorytm kalkulacji

Operator OPN wygląda tak samo jako funkcję, której argumentami są dwie wartości napisane na jej lewej stronie. Ponadto, jest to naturalny zapis do stosowania w językach programowania, jak sposób jej obliczenia odpowiada operacji stosu i konieczność analizowania jest wyeliminowane. Na przykład, ogranicznik w wyrażeniu 5 + 6 * 7 pojawi się jako 5, 6, 7 *, +, a to może być obliczone po prostu skanując od lewej do prawej i zapisywać wartości w stos. Ilekroć objawem pracy wybrany przez górny element 2 pamięci komputera, użytkownik jest używany, a wynik zwracany do pamięci. Gdy końcowy wynik wyrażenia obliczeniowego będzie na wierzchu stosu.

Na przykład:

  • S = () 5, 6, 7, *, + 5 umieszcza się na stosie.
  • S = (5) 6, 7 *, + 6 umieszcza się na stosie.
  • S = (5, 6), 7 *, 7 + umieścić stos.
  • S = (5, 6, 7), * 2 + wybieranie wartości z komina, użycie * i zapisuje wynik w stosie.
  • S = (5, 6 * 7) = (5, 42) + 2 wartości wybranych ze stosu, aby stosować + i umieścić wynik w stos.
  • S = (5 + 42) = (47) obliczenia zakończeniu wynik jest przechowywana na górze stosu.

Algorytm ten można sprawdzić RPN wielokrotnie, ale za każdym razem to będzie działać, bez względu na to jak złożona z wyrażenia arytmetycznego.

OPN i stosy są ze sobą ściśle powiązane. Ten przykład pokazuje, jak korzystać z pamięci, aby obliczyć wartość odwrotnej notacji polskiej. Mniej oczywiste jest to, że można użyć stosu, przekształcając standardową wyraz Infix w ostrej niewydolności nerek.

Przykłady języków programowania

Pascal RPN realizowany tak (pokazuje część programu).

Aby zapoznać się z liczb i operatorów w cyklu o nazwie procedura, która określa, czy token numer lub znak działania. W pierwszym przypadku, przy czym wartość zapamiętywana w stosie, a drugi z dwóch górnych stos liczb odpowiedniego działania przeprowadza się, a wynik zostaje zapisany.

toktype: = num;

read (s);

Jeśli w C [ '+' '-' '*' '/'], a następnie rozpocząć

jeśli eoln następnie cn: = '' jeszcze czytać (CN);

Jeśli cn = „”, a następnie

przypadku

'+': Toktype: = dodatek; '-': toktype: = podstrumienia;

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

koniec

inny zacząć

w przypadku a = '-', a następnie sgn: = -1 inny błąd: C '+';

z: = CN;

koniec

kończyć;

Jeśli wartość (błąd) oraz (toktype = num), a następnie getnumber;

jeśli toktype num następnie rozpocząć

Y = pop; x: = pop;

jeśli nie błąd następnie

Sprawa toktype od

dodatek: z: = x + y; Podtyp: z: = x, y; Mul: z: = x * y; Gr: z: = x / y

koniec

Push (z);

RPN C realizacja (Przedstawiona część programu):

dla (s = strtok (s, W), S, S = strtok (0, w)) {

A = strtod (s, e);

if (E> e) przycisk (a);

#define rpnop (x) printf ( "% c:" * s), B = pop () a = pop (), przycisk (x)

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

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

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

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

#undef rpnop

}

implementacje sprzętowe

W tych dniach, kiedy technologia komputer był bardzo drogie, sądzono, to dobry pomysł, aby zmusić ludzi do używania ograniczników przepięć. W 1960-tych., Jak teraz, można było kupić kalkulatorów, które pracują w odwrotnej notacji polskiej. Aby dodać 2 i 3 z nich musi wejść 2, potem 3, a następnie naciśnij przycisk „plus”. Na pierwszy rzut oka, argumenty wejściowe do operatora wydawało skomplikowane i trudne do zapamiętania, ale po pewnym czasie niektórzy są uzależnieni od tego sposobu myślenia i nie mógł zrozumieć, dlaczego inni nalegają na głupią wrostkiem, która jest tak skomplikowane i tak jest ograniczona.

Firma Burroughs nawet zbudował mainframe, która nie miała żadnych innych pamięci, oprócz stosu. Jedyną rzeczą, która sprawia, że maszyna – zastosował algorytmy i metody RPN do centralnego stosu. Wszystkie jego działania były traktowane jako ograniczniki operatorów, mającym zastosowanie do górnych wartości n. Na przykład, zespół wziął adres powrotu ze szczytu stosu, i tak dalej. D. Architektura takiej maszyny było proste, ale nie na tyle szybko, aby konkurować z bardziej popularnych architektur. Wiele jednak nadal żałuję, że tak proste i eleganckie podejście do informatyki, gdzie każdy program był wyrazem OPN, uznał swoją kontynuację.

Jeden z RPN kalkulatory czasu były popularne, a niektórzy ludzie wciąż dają im pierwszeństwo. Ponadto, opracował językach stosu zorientowanych, takich jak Forth. Dziś jest mało używany, ale nadal nostalgiczny z jego byłych użytkowników.

Więc jaki jest sens dowcipy o kiełbasą Odwrócona polskiego?

Jeśli założymy, że operator kiełbasą, notacja infix, powinien on być w rolce jak w konwencjonalnym hot doga. RPN usytuowany jest w dwie połówki Przygotuj się nimi po obliczeniu. Teraz przychodzi trudna część – musztarda. Jest już na kiełbasy, t. E. już obliczone jako operator jednoargumentowy. Uważa się, że musztarda powinny być również przedstawiony jako uncalculated i dlatego powinien zostać przeniesiony na prawo od kiełbasy … Ale to jest możliwe, wymagałoby to zbyt duży stos …