Professional Documents
Culture Documents
Poljska I Reverzna Poljska Notacija
Poljska I Reverzna Poljska Notacija
Poljska I Reverzna Poljska Notacija
SVEUČILIŠTE U SPLITU
1.UVOD....................................................................................................3
2.POLJSKA NOTACIJA...........................................................................4
2.1.Aritmetika...................................................................................................4
2.2.Računalno programiranje...........................................................................5
3.REVERZNA POLJSKA NOTACIJA.......................................................5
3.1.Objašnjenje................................................................................................5
3.2.Praktične implikacije i nedostatci...............................................................6
3.3.Implementacija...........................................................................................6
4.PRIMJENE STOGOVA.........................................................................7
4.1.Primjer – Evaluacija postfiksnog izraza.....................................................11
5.Primjer – Binarno stablo......................................................................15
6.ZAKLJUČAK........................................................................................16
7.LITERATURA......................................................................................17
2
1. Uvod
U ovom seminaru govoriti cemo o poljskoj i reverznoj poljskoj notaciji. Cilj seminara je
upoznavanje osnovnog principa spomenute notacije.
Prefiksna notacija ili prefiksni sustav oznaka je oblik notacije u logici, aritmetici i algebri. Njena
istaknuta osobina jest ta da su operatori postavljeni lijevo od operanada. Ukoliko je mjesnost
operatora čvrsta (tj. fiksirana), kao rezultat se dobiva sintaksa bez ikakvih zagrada a koja i dalje
može biti parsirana bez ikakve nejednoznačnosti. Poljski je logičar Jan Lukasiewicz izmislio ovu
notaciju oko 1920. kako bi pojednostavnio sustav oznaka propozicijskog računa. Ponekad se ova
notacija naziva i poljska notacija, kako bi se naglasila njegova nacionalnost.Iako se više ne koristi
toliko učestalo u logici, našla je uporabu u računarstvu.
Postfiksna notacija ili postfiksni sustav oznaka je matematička notacija u kojoj svaki operator
slijedi nakon svih svojih operanada. Poznatija je kao obrnuta poljska notacija (ili samo RPN od
engl. reverse Polish notation), po analogiji sa srodnom poljskom notacijom, prefiksnom
notacijom koju je 1920. uveo poljski matematičar Jan Łukasiewicz.Postfiksnu notaciju je izmislio
australski filozof i računalni znanstvenik Charles Hamblin sredinom 50-ih godina dvadesetog
stoljeća. Hamblin je predstavio svoj rad na konferenciji u lipnju 1957. te ga objavio 1957. i
1962.Većina ovoga što slijedi se odnosi na binarne operatore. Unarni operator za kojeg se
dogovorno koristi postfiksna notacija jest faktorijela.
3
2. Poljska notacija (prefiksna notacija)
2.1. Aritmetika
Izraz za zbrajanje brojeva jedan i dva je u prefiksnoj notaciji zapisan kao "+ 1 2", mjesto kao "1 +
2". U složenijim izrazima, operatori još uvijek prethode operande, ali i sami operandi mogu biti
netrivijalni izrazi koji uključuju svoje operatore. Na primjer, izraz koji bi bio zapisan kao
5 - (6 + 7)
u konvencionalnoj infiksnoj notaciji, bi bio zapisan kao
- 5 (+ 6 7)
ili jednostavno
-5+67
u prefiksnoj notaciji.
Prefiksna notacija ima široku primjenu u Lispovim S-izrazima, gdje su zagrade potrebne zbog
aritmetičkih operatora promjenjive mjesnosti (ariteta). Srodna postfiksna notacija (ili "obrnuta
poljska notacija") se često koristi u stogovno orijentiranim programskim jezicima, te predstavlja
načelo djelovanja odreĎenih kalkulatora, posebice onih od tvrtke Hewlett-Packard.
Iako se čini naizgled očitim, važno je naglasiti da broj operanada u izrazu mora biti jednak broju
operatora plus jedan, inače naredba nema smisla (pretpostavljajući samo da su binarne operacije
korištene u izrazu). Ovo se lako može previdjeti prilikom baratanja sa dužim, složenijim izrazima
sa po nekoliko operatora, te stoga valja pripaziti da izraz ima smisla prilikom korištenja prefiksne
notacije.
3.1. Objašnjenje
U postfiksnoj notaciji operatori slijede svoje operande. Na primjer, za zbrajanje tri i četiri se piše
"3 4 +" mjesto "3 + 4". Ukoliko postoje višestruke operacije, operator je dan neposredno nakon
drugog operanada, tako da bi izraz napisan u "3 - 4 + 5" u uobičajenoj infiksnoj notaciji bio
zapisan kao "3 4 − 5 +" u RPN: prvo se oduzima 4 od 3, te potom na taj rezultat dodaje 5.
Prednost RPN je ta što odstranjuje potrebu za zagradama koje pak zahtijeva infiksna notacija.
Iako "3 − 4 + 5" može biti zapisan kao "(3 − 4) + 5", to znači nešto posve drukčije od "3 − (4 +
5)", i samo se zagraĎivanjem može razriješiti nejednoznačnost meĎu dvama značenjima. U
postfiksnoj notaciji, potonje bi bilo zapisano kao "3 4 5 + −", što nejednoznačno znači
"3 (4 5 +) −".
Interpreteri postfiksne notacije su bazirani na stogu. To jest, operatori su potisnuti na vrh stoga, a
kad se operacija obavi, operandi su dohvaćeni sa stoga i rezultat je opet potisnut na vrh. Stogovi,
5
a stoga i RPN, imaju tu prednost što se lako programski i sklopovski ostvaruju i stoga su vrlo
brzi.
Čitanjem slijeva na desno, izračuni se mogu obaviti čim je pročitan operator; obraĎivanje uvijek
može započeti prije nego je cijeli izraz pročitan.
U RPN izračunima, nije potrebna tipka "=", kao što je potrebna u korištenju uobičajenih
kalkulatora, da bi se prislilo izvršavanje izračuna i evaluacija (vrjednovanje) izraza.
S druge strane, RPN kalkulatori zahtijevaju tipku "Enter" kako bi razdvojili susjedne numeričke
operande.
Stanje je uvijek samo stog vrijednosti koje čekaju operacije. Nikad se ne može dogoditi da je
operator već unesen i još čeka operande.
Susjedni brojevi moraju biti razdvojeni bjelinama, što zahtijeva precizan rukopis kako bi se
spriječila zabuna (na primjer, "12 34 +" bi moglo izgledati kao "123 4 +").
3.3. Implementacija
Prva računala koja su implementirala arhitekture koje su omogućile RPN su bili KDF9 strojevi
tvrtke English Electric, koji su bili najavljeni 1960. i postali komercijalno dostupni od 1963.
godine, te američki Burroughs B5000, najavljeni 1961. i takoĎer dostupni od 1963. Jedan od
6
dizajnera B5000 modela, R. S. Barton, kasnije je pisao kako je razvio RPN nezavisno od
Hamblina negdje oko 1958. dok je čitao udžbenik o simboličkoj logici, i prije nego je postao
svjestan Hamblinovog rada.
Tvrtka Friden je uvela RPN na tržište stolnih kalkulatora sa EC-130 modelom u lipnju 1963.
Hewlett-Packard (HP) inženjeri su dizajnirali 9100A Desktop Calculator 1968. sa RPN. Ovaj je
kalkulator popularizirao RPN u znanstvenim i inženjerskim krugovima, iako prve reklame za
9100A uopće nisu spominjale RPN. HP-35 model znanstvenog kalkulatora je bio prvi džepni
RPN kalkulator 1972. HP-10C serija kalkulatora, uključujući poznati financijski kalkulator HP-
12C, je takoĎer koristila RPN. Kad je HP uveo kasniji model poslovnog kalkulatora HP-19B bez
podrške za RPN, povratna sprega od strane financijera i drugih korisnika koji su navikli koristiti
model 12-C ih je prisilila da puste u prodaju model HP-19BII, koji je korisnicima šružio
mogućnost odabira algebarske notacije ili RPN.
4. Primjene stogova
(((24/6)*(7-2))+15)
7
Definirajmo nivo ugnježĎivanja kao broj parova zagrada koji se nalaze oko nekog operatora. U
aritmetičkim izrazima sa potpunim zagradama redoslijed izvršavanja operatora je po opadajućem
nivou ugnježĎivanja. Prvo se izvršavaju operatori sa najvećim nivoom, nakon toga slijede
operatori sa slijedećim manjim nivoom, a na kraju se izvršavaju operatori s nivoom 1. U gornjem
izrazu postoje dva podizraza koji imaju nivo 3. To su podizrazi: (24/6) i (7-2). U takvim
situacijama, kada više operatora ima isti nivo, izvršavanje operatora se obavlja s lijeve strane
prema desnoj strani. To znači da će se u gornjem aritmetičkom izrazu prvo izračunati izraz
(24/6), a zatim izraz (7-2). Nakon toga se prelazi na nivo 2 na kojem se nalazi operator *,
odnosno slijedeći podizraz: ((24/6)*(72)). Na nivou 1 se nalazi operator + pa se izračunava izraz
(((24/6)*(7-2))+15), što na kraju daje konačan rezultat. Kod izraza sa potpunim zagradama nije
potrebno definirati prioritet operatora. MeĎutim, upravo definiranjem prioriteta operatora se
smanjuje broj zagrada. Kao primjer možemo navesti da je operacijama množenja i dijeljenja
pridružen veći prioritet u odnosu na operacije zbrajanja i oduzimanja. Ako se neki operand nalazi
izmeĎu dva operatora sa različitim prioritetom, tada se operand pridružuje operatoru sa
definiranim većim prioritetom. Na primjer, u izrazu 24/6+15 operand 6 je pridružen operatoru
dijeljenja. U zapisu sa potpunim zagradama prethodni izraz ima oblik ((24/6)+15). Ako bi željeli
da operand 6 pridružimo operatoru +, onda bi zapis prethodnog izraza trebao biti 24/(6+15). Za
svaki operator je pored prioriteta potrebno definirati i smjer grupiranja koji se primjenjuje kod
susjednih operatora istog prioriteta. Najčešće se koristi smjer grupiranja s lijeve strane u desno.
Kod izraza sa nepotpunim zagradama redoslijed izvršavanja operatora je takav da se prvo
izvršavaju operatori na višim nivoima, a zatim operatori na nižim nivoima. U situaciji kada ima
više operatora u okviru istog para zagrada izvršavanje operatora je definirano prioritetom, te ako
više susjednih operatora ima isti prioritet redoslijed izvršavanja je definiran smjerom grupiranja.
Na primjer, za izraz sa nepotpunim zagradama 24/6*(7-2*3)+15 redoslijed izvršavanja operatora
bi bio:
1. 2*3
2. 7-2*3
3. 24/6
4. 24/6*(7-2*3)
5. 24/6*(7-2*3)+15
Prema tome, možemo zaključiti da korištenje infiksne notacije zahtijeva uvoĎenje dva dodatna
koncepta. Prvi koncept se odnosi na prioritet operatora, dok se drugi koncept odnosi na upotrebu
zagrada pomoću kojih se može odrediti redoslijed izvršavanja operacija. Osim toga, prevodiocu
je potrebno da u više navrata ispituje izraz s lijeva udesno da bi odredio redoslijed izvršavanja
operacija. Ovaj nedostatak infiksne notacije se može izbjeći upotrebom prikaza aritmetičkih
izraza sa drugačijim rasporedom operanada i operatora. Jedan od tih načina prikaza je tzv.
postfiksna notacija ili reverzna poljska notacija (eng. reverse Polish notation). Prema
postfiksnoj notaciji, kao što i samo ime sugerira, operator se nalazi iza operanada. Na primjer,
izraz za zbroj 7 + 4 napisan u infiksnoj notaciji, bi u postfiksnoj notaciji imao oblik 7 4 +. Dakle,
aritmetički izraz u infiksnoj notaciji pretvaramo u izraz zapisan u postfiksnoj notaciji tako što se
operator sa mjesta izmeĎu dva operanda premjesti iza drugog operanda. Kod nešto složenijih
izraza, najjednostavniji način da izraz u infiksnoj notaciji zapišemo u obliku sa potpunim
zagradama. Zatim svaki operator prebacimo na mjesto tom operatoru pripadajuće desne zagrade,
te na kraju uklonimo sve zagrade iz izraza. Na primjer, ako imamo izraz u infiksnom zapisu 15 +
24/(6-3)+(8-4)*5, prvo ćemo taj izraz pretvoriti u izraz sa potpunim zagradama:
8
( ( 15 + ( 24 / ( 6 -3 ) ) ) + ( ( 8 -4 ) * 5 ) )
((15 +( 24/(6-3)))+((8-4)*5))
( ( 15 ( 24 ( 6 3 -/ + ( ( 8 4 -5 * +
15 +*548+/3624--
Možemo reći da na prvi pogled nije tako očigledno zašto primjena postfiksne notacije rezultira
aritmetičkim sistemom koji eliminira potrebu za prioritetima operatora i zagradama. Zato ćemo u
nastavku opisati jedan algoritam za evaluaciju izraza u postfiksnoj notaciji. Taj algoritam koristi
stekove i radi na slijedeći način:
3. Nakon čitanja svih simbola iz ulaznog stoga uzeti rezultat sa stoga (rez=pop(S))
4. Ispitati da li je stog prazan nakon čitanja rezultata u varijablu rez.
(a) Ako je stek nakon čitanja rezultata ostao prazan onda algoritam kao rezultat vraća vrijednost
rez.
(b) Inače, ako stog nije prazan algoritam signalizira da je ulazni postfiksni izraz nepravilan.
Mehanizam rada algoritma ćemo ilustrirati na jednom jednostavnom primjeru. Na primjer,
razmotrimo slijedeći izraz: 4 3 + 8 *. Na Slici 1.0. je prikazano stanje na stogu u svakoj fazi
algoritma. Na početku se prvo pročita token 4 i stavlja se na stog. Zatim se čita slijedeći token 3 i
takoĎer se stavlja na stog. Treći pročitani token je operator (+), pa se sa steka uzimaju dva tokena
(3 i 4), primjenjuje se operator + što rezultira brojem 7 koji se u skladu s algoritmom stavlja na
stek. Slijedeći pročitani token je broj 8, tako da se stavlja na stog. Zadnji pročitani token (*) je
operator, što znači da se sa stoga trebaju uzeti dva tokena (8 i 7) da bi se primijenio pročitani
operator (*). Rezultat primjene operatora je 56 i stavlja se na stog. Nakon čitanja svih simbola u
ulaznom izrazu, u slijedećem koraku se sa stoga uzima rezultat (56). Pošto je stog ostao prazan,
algoritam vraća rezultat 56.
9
Slika 1.0.
Prema tome, postfiksni izraz 4 3 + 8 * je evaluiran kao infiksni izraz (4+3)*8, pri čemu za zapis
postfiksnog izraza nisu korišteneni prioriteti opearotora i zagrade. Pogledajmo sada kako će biti
evaluiran slijedeći izraz: 4 3 8 * +. Na Slici 1.1. je prikazano stanje stoga za svaku od faza
izvršavanja algoritma.
Slika 1.1.
Dakle, postfiksni izraz 4 3 8 * + je evaluiran kao 4 + (3*8). Radi ilustracije algoritma razmotrimo
još jedan primjer postfiksnog izraza:
10
Slika 1.2. Evaluacija postfiksnog izraza 15 24 6 3 - / + 8 4 – 5 * +
Kada se pročitaju svi znakovi iz ulaznog postfiksnog izraza na stogu treba ostati samo jedan
element koji predstavlja rezultat. Nakon čitanja rezultata stog bi trebao ostati prazan ako je
postfiksni izraz pravilan. U suprotnom, ako nakon uzimanja rezulatata stog nije prazan, to znači
da postfiksni izraz nije pravilan i da sadrži više operanada nego što broj operatora zahtijeva.
Osim toga, greška zbog neispravnosti izraza se može pojaviti i u slučajevima kada je u
postfiksnom izrazu pročitan znak koji predstavlja operator, pa se pri uzimanju operanada sa stoga
pojavljuje greška zbog toga što je stog prazan. Ovakva situacija predstavlja situaciju u kojoj
pročitani operator nema dovoljno operanada. Iz prethodnih primjera možemo vidjeti da je
prednost postfiksne notacije u tome da se izračunavanje izraza može obaviti u samo jednom
prolazu bez voĎenja računa o zagradama i prioritetima.
• intstack.h
• intstack.cpp
• intpost.h
• intpost.cpp
• main.cpp
U tablici 1.1. je prikazan sadržaj datoteke intpost.h u kojoj je definirana klasa IntPostFix. U
tablici 1.2. je prikazana datoteka intpost.cpp u kojoj su definirane članske funkcije za klasu
IntPostFix. U tabeli 1.3. je prikazana datoteka main.cpp u kojoj se nalazi testni program.
11
Tablica 1.0. - intpost.h
12
13
Tablica 1.2. - intpost.cpp
14
5. Primjer – Binarno stablo
Binarno stablo se može prikazati i tekstualnim zapisom, prema algoritmu prefiksne notacije
stabla, na sljedeći način:
Ovaj oblik notacije se naziva prefiksna notacija jer se apstraktno može smatrati da element
unutarnjeg čvora stabla predstavlja prefiksni operator koji djeluje na svoju djecu.
Prefiksna notacija se često koristi za zapis aritmetickih izraza. Ona se vrši na nacin da se u
zagradama najprije zapiše operator, a zatim dva operanda. Operand može biti broj ili izraz. Ako
je operand izraz, ponovo se primjenjuje isto pravilo. Primjerice, izraz infiksne notacije 8*(7+3)
ima prefiksnu notaciju ( * 8 (+3 7) ). Zbog ovog svojstva aritmetički izrazi se mogu pohraniti u
binarnom stablu.
15
6. Zaključak
Upoznavši osnovni princip poljske i reverzne poljske notacije vidjeli smo da su mnoge tvrtke
uvele RPN na tržište stolnih kalkulatora 1963. Godine. Taj kalkulator je popularizirao RPN u
znanstvenim i inženjerskim krugovima, iako prve reklame uopće nisu spominjale RPN. A
prefiksna je notacija osobito popularizirana kod stogovno baziranih operacija zbog svoje uroĎene
sposobnosti da lako razlikuje redoslijed operacija bez potrebe za zagradama. Da bi se evaluirao
redoslijed operacija u prefiksnoj notaciji, nije ni potrebno zapamtiti hijerarhiju prednosti
operatora, kao što je već potrebno sa infiksom notacijom. Umjesto toga, izravno se gleda u zapis
da bi se otkrio operator koji se prvi evaluira. Takoder način na koji se primjenjuje u binarnom
stablu vrlo je učinkovit te jednostavan, i s tim riječima zaključujem ovaj seminar.
16
7. Literatura
http://www.hpmuseum.org/rpn.htm 26.01.2010.
http://lukaszwrobel.pl/blog/reverse-polish-notation-parser 26.01.2010.
http://snipplr.com/view/8962/infix-notation-to-reverse-polish-notation/ 26.01.2010.
http://h20331.www2.hp.com/hpsub/us/en/rpn-calculator.html 27.01.2010.
http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/ 27.01.2010.
http://www.scribd.com/doc/11541643/Programski-Jezik-C 27.01.2010.
17