Reverzná poľská položka: algoritmus, metódy a príklady

Opačný poľský záznam raz vytvoril základ sveta počítačového programátora. Dnes nie je taká známa. Preto môže byť humorné zobrazenie, ktoré znázorňuje "reverzné" poľské klobásy mimo buniek, stále pre niektorých známych programátorov nepochopiteľné. Nie je to dobré vysvetlenie pre vtip, ale v tomto prípade bude úplne oprávnené.

Infix Record

Všetci programátori a väčšina študentov sú oboznámení s používaním operátorov. Napríklad vo výraze x + pridajte hodnoty premenných x a y, použije sa prídavný symbol. Je menej známe, že označenie požičané z matematiky nazývané infixnoy notácia je v skutočnosti hlavným problémom pre stroje. Takýto operátor má ako vstup dve hodnoty, zapísané vľavo a napravo od neho. Pri programovaní je použitie symbolov s operačnými znakmi voliteľné. Napríklad, x + y môže byť napísané ako funkcia kompilácie (x, y), v ktorej kompilátor nakoniec transformuje infix notáciu. Avšak každý vie matematiku príliš dobre, aby nepoužíval aritmetické výrazy, ktoré tvoria akýsi vnútorný mini-jazyk takmer v každom programovacom jazyku.


prekladačov vzorca

Prvý skutočne úspešný programovací jazyk Fortran stal sa tak predovšetkým preto, že aritmetický výraz (tj vzorec) sa ukázalo (vysielanie) v kóde, preto jeho meno - rovnica preklad. Predtým museli napríklad zaznamenaťvo forme funkcií tvorí (a, násobiť (b, c)). V Kobole bol problém realizácie automatickej transformácie vzorcov považovaný za veľmi ťažký, pretože programátori museli písať veci ako Add A To B. Mutliply C.


Čo je zlé s infixom?

Problém spočíva v tom, že operátori majú také vlastnosti ako prioritu a asociativitu. Z tohto dôvodu sa definícia infixovej funkcie stáva netriviálnou úlohou. Napríklad priorita násobenia je vyššia ako pridanie alebo odpočítanie, čo znamená, že výraz 2 + 3 * 4 nie je rovný súčtu 2 a 3 vynásobenej 4, ako keby boli operátori vykonávaní zľava doprava. V skutočnosti by ste mali vynásobiť 3 x 4 a pridať 2. Tento príklad ilustruje, že výpočet výrazov infix často vyžaduje zmenu poradia operátorov a ich operandov. Okrem toho musíte použiť zátvorky, aby sa poznámka zobrazila jasnejšie. Napríklad (2 + 3) * (4 + 5) nemožno písať bez zátvoriek, pretože 2 + 3 * 4 + 5 znamená, že musíte vynásobiť 3 a 4 a pridať 2 a 5.
Poradie, v ktorom je potrebné vypočítať operátorov, si vyžaduje dlhú pamäť. Z tohto dôvodu, školáci, začiatočníci štúdium aritmetiky, často získajú nesprávne výsledky, aj keď skutočné operácie sú vykonávané správne. Je potrebné naučiť sa postupom operátorov srdcom. Najprv treba vykonať kroky v zátvorkách, potom násobenie a delenie a nakoniec pridávanie a odčítanie. Existujú však aj iné spôsoby, ako napísať matematické výrazy, pretože infixová notácia je len jedným z možných "malých jazykov", ktoré sa dajú pridať do väčších.

Prefix a postfixOznačenie

Dva z najznámejších alternatívnych variantov sú záznam operátora pred alebo po operandoch. Sú známe ako prefixové a postfixové notácie. Logika Jan Lukasiewicz prišiel s prvým z nich v dvadsiatych rokoch 20. storočia. Žil v Poľsku, takže sa rekord nazýva poľsky. Variant postfix dostal názov reverznej poľskej notácie (OPN). Jediný rozdiel medzi týmito dvoma metódami je smer, mali by ste si prečítať záznam (zľava doprava alebo sprava doľava), takže niektoré detaily, aby do úvahy iba jeden z nich. V OPN sa operátor zaznamenáva po jeho operandoch. Takže výraz AB + je príkladom reverznej poľskej položky pre A + B.

neobmedzený počet operandov

zápis bezprostrednej výhodou je, že zhŕňa operátora n-adycheskym a ynfyksnaya notáciu naozaj len pracuje s dvoma hodnotami, ktoré je vo svojej podstate je vhodná len pre binárne operácie. Napríklad ABC @ je inverzná poľský výraz pomocou tryadycheskoho značku, ktoré je maximálna hodnota z A, B a C. V tomto prípade je, že prevádzkovateľ 3 operandu opustil sám a spĺňa funkciu volania @ (A, B, C). Ak sa pokúsite pridať "@" symbol ako ynfyksnoho príklade A @ pred naším letopočtom, alebo niečo také, je zrejmé, že to jednoducho nefunguje.

Priorita je daná príkazom

Reverzný poľský záznam má ďalšiu výhodu, že priorita operátorov môže byť reprezentovaná poradím ich výskytu. To nikdy nepotreboval rovnátka, aj keď môžu byť zahrnuté ako znaky operácie s cieľom uľahčiťkonverzia s notovým zápisom. Napríklad AB + C * je jedinečný ekvivalent (A + B) * C, pretože násobenie nie je možné vypočítať, kým sa nepočíta s druhým operandom pre násobenie. To znamená, že ak AB + C * vypočítava jeden operátor naraz, potom A B + C * -> (A B +) * C -> (A + B) * C.

Výpočtový algoritmus

V OPC operátor vyzerá rovnako ako funkcia, ktorá akceptuje ako dva argumenty hodnoty napísané naľavo od neho. Okrem toho je to prirodzený zápis pre použitie v programovacích jazykoch, pretože priebeh jeho výpočtov zodpovedá operáciám zásobníka a potreba parsovania neexistuje. Napríklad v OPC bude výraz 5 + 6 * 7 vyzerať ako 567 *, + a dá sa vypočítať skenovaním zľava doprava a zapisovaním hodnôt do zásobníka. Pri každom nájdení transakcie sa vyberú dva horné prvky pamäte počítača, operátor sa použije a výsledok sa vráti do pamäte. Po dosiahnutí konca výrazu sa výsledok výpočtov zobrazí v hornej časti zásobníka. Napríklad:
  • S = () 567 *, + vložte 5 do stohu.
  • S =
    6 7 *, + vložte 6 do stohu.
  • S = (5 6) 7 *, + vložte 7 do stohu.
  • S = (567) *, + zvoľte 2 hodnoty zo stohu, použite * a výsledok umiestnite do zásobníka.
  • S = (5 6 * 7) = (542) + vyberte 2 hodnoty zo stohu, aplikujte + a umiestnite výsledok na zásobník.
  • S = (5 + 42) = (47) Výpočet je úplný, výsledok je v hornej časti stohu.
  • Tento algoritmus reverzného leštenia je možné skontrolovať mnohokrát, ale zakaždým to bude fungovať bez ohľadu na to, koľkoaritmetický výraz je zložitý. OPN a stoky sú úzko prepojené. Nižšie uvedený príklad ilustruje, ako možno pamäť použiť na výpočet hodnoty reverznej poľskej notácie. Je menej zrejmé, že môžete použiť zásobník, ktorý transformuje štandardné infixové výrazy do TNF.
    Príklady programovacích jazykov
    V jazyku Pascal sa reverzný poľský záznam implementuje približne (zobrazená časť programu). Čítanie čísel a operátorov v slučke sa nazýva postup, ktorý určuje, či token je číslo alebo znak operácie. V prvom prípade sa hodnota zapíše do zásobníka a v druhej nad dve horné čísla zásobníka sa vykoná príslušná akcia a výsledok sa uloží. toktype: = num; čítaj (c); ak v ['+', '-', '*', '/'] sa začne, ak eoln potom cn: = 'else else (cn); ak cn = '' potom prípad od '+': toktype: = add; '-': toktype: = sub; '*': toktype: = me; '/': toktype: = div koniec iný štart, ak c = '-' potom sgn: = -1 iná chyba: = s & lt; & gt; '+'; c: koncový koniec cn; ak (nie chyba) a (toktype = num) potom getnumber; ak toktype < num začína: = ro; x: = ro; ak žiadna chyba potom prípad, toktype add: z: = x + y; sub: z: = x-y; me: z: = x * y; div: z: = koniec tlačidla x /y (z); C-realizácia reverzného poľského záznamu (časť programu je daná): pre (s = strtok (s, w); s; s = strtok (0 w)) {a = strtod (s & e); ak (e & s) stlačte (a); # Define rpnop (x) printf ("% c:", * s), b = (POP), a = (POP), tlačidlo (x) else if (* s == '+') rpnop (A + B ) inak ak (* s == '-') rpnop (a - b); inak ak (* s == '*') rpnop (a * b); inak ak (* s == '/') rpnop (a /b); #undef rpnop}

    Realizácia hardvéru

    V čase, keď bola výpočtová technológia veľmi drahá, bolo považované za dobrý nápad prinútiť ľudí, aby používali OPN. V šesťdesiatych rokoch, ako v súčasnosti, bolo možné zakúpiť kalkulátory, ktoré pracujú naopakPoľský rekord. Ak chcete pridať 2 a 3, musíte zadať 2 potom 3 a kliknite na tlačidlo plus. Na prvý pohľad vstupný operandy operátor zdalo zložité a ťažké si spomenúť, ale po chvíli niektoré z nich sú závislí na tento spôsob myslenia a nemohol pochopiť, prečo iní trvajú na stupídny zázname ynfyksnoy, ktorý je tak zložitý a tak obmedzený. Burroughs dokonca postavil sálový počítač, ktorý nemal žiadnu inú RAM s výnimkou stohu. Jediná vec, ktorú urobil auto - použili algoritmy a metódy opačného poľského písania na centrálny stoh. Všetky jej operácie boli považované za prevádzkovateľov OPN, ktorých pôsobenie sa rozšírilo na n vyššie hodnoty. Napríklad príkaz Return dostal adresu z hornej časti zásobníka atď. Architektúra takéhoto stroja bola jednoduchá, ale nie dostatočne rýchla, aby konkurovala všeobecnejšej architektúre. Mnohí však stále ľutujú skutočnosť, že taký jednoduchý a elegantný prístup k počítačom, kde bol každý program vyjadrením NPN, nenašiel jeho pokračovanie. Raz sa kalkulačky s reverzným poľským záznamom tešili obľube a niektoré si stále dávajú prednosť. Navyše boli vyvinuté jazyky orientované na zásobníky, ako napríklad Forth. Dnes sa používa málo, ale stále spôsobuje nostalgiu zo strany bývalých používateľov.

    Takže aký je zmysel žartovať o reverznej poľskej klobásy?

    Za predpokladu, že operátor klobása, notáciu ynfyksnoy by malo byť vnútri chleba, ako v obvyklých párkov v rožku. V opačnom poľskom rekorde je to vpravodve polovice, je pripravená dostať sa medzi nimi po výpočte. Teraz začína najťažšia časť - horčica. Už je na klobáku, ktorá už je vypočítaná ako unárny operátor. Predpokladá sa, že horčica by mala byť zobrazená aj ako nekultivovaná, a preto by mala byť presunutá napravo od klobásy. Ale možno to vyžaduje príliš veľa zásob.

    Súvisiace publikácie