RačunalaSoftver

RPN: algoritam, metode i primjeri

RPN jednom formirana osnovu programer u svijetu. Danas nije tako dobro poznat. Stoga, strip ilustraciju, prikazom "preokrenuti" Poljski peciva kobasica van, i dalje može biti pogrešno shvaćen od strane nekih znanja programera. Ne baš dobro objasniti šala, ali u ovom slučaju to će biti u potpunosti opravdana.

infiks

Svi programeri, kao i većina studenata su upoznati sa upotrebom operatora. Na primjer, izraz x + zbir vrijednosti za varijable x i y rabljene znak plus. Manje poznata je činjenica da je ovaj je pozajmljen iz matematike zapis pod nazivom infiks zapis, u stvari, predstavlja veliki problem za mašine. Ovaj operater prima kao ulaz dvije vrijednosti se snimaju na lijeve i desne. U programiranju notacija koristi po izboru sa znakovima operacija. Na primjer, x + y se može pisati kao funkcija puta (x, y), u kojoj je kompajler i na kraju pretvara infiks zapis. Međutim, svi znaju matematika je previše dobro da ne koristite aritmetičkih izraza, koji čine neku vrstu unutrašnje mini-jezika u skoro svakom programskom jeziku.

formula translator

Prvi stvarno uspješan Fortran programski jezik je postao tako uglavnom zbog toga što aritmetički izraz (npr formula ..) To pretvoriti (broadcast) u kodu, otuda i ime za to - FORMULA prevod. Prije toga, morali su da pišu, na primjer, savijeni u obliku funkcija (i umnožavaju (b, c)). U COBOL-u problem realizacije automatske konverzije formule se smatra veoma teško jer su programeri morali da pišu stvari kao što Dodaj A do B Mutliply C.

Ono što nije u redu sa infiks?

Problem je u tome, da operatori imaju takva svojstva kao prednost i asocijativnost. Zbog toga, definicija infiks funkcija postaje ne-trivijalan zadatak. Na primjer, množenje ima veći prioritet od toga ili oduzimanjem, što znači da je izraz 2 + 3 * 4 nije jednak zbiru 2 i 3, pomnožen sa 4, jer bi to bilo u obavljanju operatora s lijeva na desno. U stvari, pomnožite 3 do 4 i dodajte 2. Ovaj primjer pokazuje da proračun infiks izraz često zahtijeva promjenu u poretku operatora i operanada. Pored toga, potrebno je koristiti protezu gledati jasnije zapis. Na primjer, (2 + 3) * (4 + 5) ne može biti napisan bez zagrada, jer 2 + 3 * 4 + 5 znači da trebate pomnožiti 3 do 4 i dodajte 2 i 5.

Redoslijed kojim želite da izračunate operatera zahtijeva dugo pamtiti. Zbog toga, studenti koji počnu da uče aritmetika, često dobiti pogrešne rezultate, čak i ako je stvarna operacije se izvode pravilno. Neophodno je naučiti kako akcije izjave napamet. Prvo, akcija mora se odvijati u zagradama, zatim množenje i dijeljenje, i na kraju sabiranje i oduzimanje. Međutim, postoji još jedan način pisanja matematičkih izraza kao infiks zapis je samo jedan od mogućih "malih jezika" koji se može dodati više.

Prefiks i posiks

Dva od najpoznatijih alternativa za snimanje operator prije ili nakon operandi. Oni su poznati kao prefiks i posiks. Logičar Yan Lukasevich izumio prvi u 1920. Živio je u Poljskoj, tako da je zapis se zove poljski. Postfix verzija, odnosno, zove Reverse Polish Notation (ARF). Jedina razlika između ove dvije metode je pravac u kojem se pročitati zapisnik (s lijeva na desno ili pravo na lijevo), tako da je dovoljno da se razmotri detaljno samo jedan od njih. Operator OPN je napisano nakon operandi. Prema tome, izraz AB + predstavlja primjer RPN za A + B.

Neograničen broj operanada

Neposredna prednost notacija je da sumira n-adic operatera i infiks zapis je zapravo samo radi sa dva operanda, t. E. su sami po sebi prikladan samo za binarne operacije. Na primjer, ABC @ je obratna poljski izraz koristi trijadična znak koji je maksimalna vrijednost A, B i C. U ovom slučaju operator djeluje na lijevoj tri same operanda i odgovara na poziv funkcije @ (A, B, C). Ako pokušate da napiše @ simbol kao infiks, kao što je @ BC ili nešto slično, postaje jasno da to jednostavno ne radi.

Prioritet je dao naredbu

RPN ima još jednu prednost u da je prioritet operatora može biti predstavljen po nalogu svog izgleda. Istovremeno nikada trebati potpora, iako mogu biti uključeni kao likovi operacije kako bi se olakšalo konverziju iz infiks zapis. Na primjer, AB + C * - nedvosmislen ekvivalent (A + B) * C, tako da množenja ne može izračunati do toga obavlja, što daje drugi operand za množenje. To jest, ako je izračunata AB + C * jedan operator u jednom trenutku, dobijamo AB + C * -> (AB +) * C -> (A + B) * C.

proračun algoritam

Operator OPN izgleda isto kao funkcija koja uzima kao argument dvije vrijednosti napisano je ostavio. Osim toga, to je prirodni zapis za upotrebu u programskim jezicima, kao način obračuna odgovara stog operacije i potreba za raščlanjivanje je ispao. Na primjer, prenapona u izrazu 5 + 6 * 7 će se pojaviti kao 5, 6, 7 *, +, i može se jednostavno izračunati skeniranje s lijeva na desno i pisati vrijednosti u stog. Kad god zajednički znak rada, po izboru gornji element 2 memorije računala, koristi se operator, a rezultat se vratio u memoriji. Kada krajnji rezultat izraza proračuna će biti u vrhu steka.

Na primjer:

  • S = () 5, 6, 7, *, + 5 postavljen na stogu.
  • S = (5) 6, 7, *, + 6 postavljen na stogu.
  • S = (5, 6), 7 *, 7 + postavite steka.
  • S = (5, 6, 7), * 2 + odabrati vrijednosti iz steka, koristite * i postaviti rezultat na stog.
  • S = (5, 6 * 7) = (5, 42) + 2 vrijednosti izabrane iz steka, da primjenjuju + i stavio rezultat u stog.
  • S = (5 + 42) = (47) proračun je završena, rezultat je pohranjena u vrhu steka.

Ovaj algoritam se može proveriti RPN više puta, ali svaki put kada će raditi, bez obzira na složenost aritmetički izraz.

OPN i gomile su usko povezani. Ovaj primjer pokazuje kako koristiti memoriju za izračunavanje vrijednosti obrnuto poljski notacija. Manje očigledno je da možete koristiti stog, pretvarajući standard infiks izražavanja u akutno zatajenje bubrega.

Primjeri programskih jezika

Pascal RPN shvatila ovako (pokazuje dio programa).

Da biste pročitali brojke i operatora u ciklusu pod nazivom postupak, koji određuje da li token broj ili znak rad. U prvom slučaju, vrijednost pohranjene u stog, a drugi od dva gornja stog broja odgovarajućih akcija se izvodi i rezultat je pohranjena.

toktype: = num;

pročitati (e);

Ako je C u [ '+', '-', '*', '/'], a zatim početi

ako eoln onda cn = '' drugo čitati (CN);

ako cn = '' onda

slučaju

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

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

kraj

drugo početi

Ako je a = '-' onda SGN: = -1 drugo greška: = c <> '+';

sa: = cn

kraj

završiti;

if (nije greška) i (toktype = broj), a zatim getnumber;

ako toktype <> num tada početi

y = pop; x: = pop;

ako ne error onda

slučaj toktype od

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

kraj

push (z);

C-implementacija RPN (prikazan u okviru programa):

za (e = strtok (e, w); s; s = strtok (0, w)) {

a = strtod (e, i e);

if (e> e) push (a);

#define rpnop (x) printf ( "% c", * e), b = pop (), a = pop (), push (x)

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

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

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

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

#undef rpnop

}

hardverskoj implementaciji

U tim danima, kada kompjuterska tehnologija bila vrlo skupa, što se mislilo dobra ideja da prisili ljude da koriste prenapona. Godine 1960.-ih godina., Kao i sada, bilo je moguće kupiti kalkulatora, koji rade u obrnutom poljski notaciji. Da biste dodali 2 i 3 od njih mora unijeti 2, zatim 3, i pritisnite "plus" gumb. Na prvi pogled, ulazni operandi operatoru činilo komplicirana i teško zapamtiti, ali nakon nekog vremena neki su ovisni o ovaj način razmišljanja i ne mogu shvatiti zašto je drugi insistiraju na glup infiks, koji je tako složen i tako je ograničen.

Burroughs kompanija čak izgradila mainframe, koji nije imao drugog pamćenja, osim stack. Jedina stvar koja čini mašina - primjenjuje algoritmi i metode RPN na centralni dimnjak. Sve svoje operacije su smatrani prenapona operatora, koji se odnosi na gornje vrijednosti n. Na primjer, tim uzeo povratnu adresu sa vrha steka, i tako dalje. D. Arhitektura takva mašina je bio jednostavan, ali ne dovoljno brzo da se takmiči sa češći arhitekture. Mnogi, međutim, i dalje žalim zbog činjenice da takav jednostavan i elegantan pristup računarstva gdje je svaki program bio izraz OPN, pronašao nastavak.

Jednom kalkulatora sa RPN bili popularni, a neki ljudi ih i dalje daju prednost. Osim toga, oni su razvili gomilu orijentisani jezici, kao što je Forth. Danas je to malo rabljene, ali i dalje nostalgični iz svog bivšeg korisnika.

Dakle, što je značenje šale o Reverse Polish kobasica?

Ako pretpostavimo da je operator kobasica, u infiks notacija, to bi trebalo da bude u okviru roll kao u konvencionalnim hot dog. RPN nalazi se u dva dijela dobiti spremni therebetween nakon obračuna. Sada dolazi teži deo - senf. Ona je već na kobasice, t. E. Već obračunava kao unarnog operatera. Smatra se da senf treba prikazati kao neobračunate i zato treba prebaciti u desno od kobasica ... Ali, to je moguće, to bi zahtijevalo prevelik hrpu ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 bs.atomiyme.com. Theme powered by WordPress.