nav_dugme codeBlog codeBlog
  • početna Početna stranica
  • Sačuvani članci Sačuvani članci
  • Članci
     (spisak)
  • Kontakt
Povratak na vrh stranice

Info & povezani članci Info o članku - dugme

Info

trejler_sat Datum objave: 10.11.2020.

trejler_dokument Jezici: C#

trejler_teg_narandzasti Težina: 8/10

postfiksna notacija
shunting yard
edsger dijkstra
dijkstra
C#
algoritam
o(n)
strukture podataka
stablo izraza
stack
stek
queue
red za čekanje
lista
optimizacija
teorija
zanimljivosti

Tema: Shunting yard

Postfiksna notacija - kako računari računaju?Implementacija - 2. deo - Računanje vrednosti postfiksnog izrazaBinarna stabla i algebarski izrazi (stablo izraza)
Generator stabla izraza (web aplikacija)

Povezani članci

Strukture podatakaAVL Stablo - Implementacija - 3. deo - Obilazak stablaTutorijal: Implementacija jednostruko ulančane liste u programskom jeziku C++Binarno stablo pretrageKlase složenosti algoritama (O notacija)Metode za optimizaciju algoritamaKako napraviti syntax highlighterIzbor prvog programskog jezikaASCII, Unicode i UTF - Predstavljanje znakova na računarimaGNU/Linux - 1. deo - Uvod
Svi članci
Programs must be written for people to read, and only incidentally for machines to execute.
Harold Abelson

Shunting Yard - Implementacija - 1. deo - Prevođenje izraza iz infiksnog zapisa u postfiksni

Facebook LinkedIn Twitter Viber WhatsApp E-mail
zoom_plus zoom_minus bookmark
početna > Članci > Teorija

Uvod

U uvodnom članku o postfiksnoj notaciji pisali smo o tome koliki značaj i upotrebnu vrednost postfiksni zapis ima u tumačenju algebarskih izraza na računarima, međutim, konkretan postupak za transformaciju izraza koji smo prikazali na kraju (iako sam po sebi informativan), u velikoj meri je proizvoljan i svojstven samo ljudskom načinu razmišljanja, i stoga je ostalo da prodiskutujemo o (zvaničnom) algoritmu za pretvaranje infiksnih izraza u postfiksne ....

Kratko podsećanje

Za sam početak, nekoliko osnovnih smernica sa kojima smo se već upoznali:

  • infiksna notacija nije optimalan način za zapisivanje algebarskih izraza na računarima (podsetićemo se ispod na konkretne razloge)
  • nedostatak efikasnijeg rešenja, neko vreme je praktično sputavao početak razvoja računarske industrije
  • problem je rešen 1961, kada je Edzger Dajkstra (holandski naučnik svetskog glasa), objavio članak sa opisom algoritma za računanje vrednosti algebarskih izraza, koji je zasnovan na tzv. Obrnutoj poljskoj ("postfiksnoj") notaciji *

Kao što smo videli u uvodnom članku, pri proceni vrednosti infiksnih izraza (u kojima se pojavljuju operatori različitih prioriteta), glavni problem tiče se nedostatka informacije o ("pravom") ** prioritetu operatora koji se u određenom trenutku razmatra, što onemogućava rešavanje izraza u 'jednom prolasku' (tj. u 'prvom prolasku').

Rešenje koje smo prikazali (u članku o postfiksnoj notaciji), praktično je podrazumevalo svođenje infiksnog izraza na postfiksni oblik - uz korišćenje stabla koje smo konstruisali po ugledu na početni (infiksni) izraz, ali, budući da računari ne mogu (u praktičnom smislu), koristiti stabla izraza zarad početnog utvrđivanja prioriteta operacija (budući da takva stabla ne nastaju u memoriji "sama od sebe"/"u trenutku" i sl), *** potrebno je primeniti drugačiji postupak ....

* Obrnuta poljska notacija (čijim se utemeljivačem smatra australijski naučnik Čarls Hamblin), zasnovana je na idejno sličnoj Poljskoj ("prefiksnoj") notaciji, koju je sredinom dvadesetih godina 20. veka osmislio Jan Lukašijevič, čuveni poljski matematičar.

** U infiksnim izrazima, prioritet operatora je 'načelno poznat' (zagrade > množenje ili deljenje > sabiranje ili oduzimanje), ali, u najpraktičnijem smislu, prioritet određenog pojedinačnog operatora - u odnosu na ostale operatore iz izraza, zapravo nije "poznat unapred".

U postfiksnim izrazima (kao što smo videli u uvodnom članku), prioritet operatora takoreći ne postoji, to jest, delovi izraza mogu se računati čim određeni operator 'dospe na obradu'.

*** Kao što smo takođe primetili, računari (i te kako) mogu koristiti stabla izraza zarad određivanja prioriteta operatora (i zarad 'simuliranja' prepoznavanja prioriteta unutar infiksnog izraza i sl), ali - tek pošto se izvesna količina procesorskog vremena utroši na kreiranje strukture stabla izraza (uz korišćenje postupka koji je sličan postupku koji sledi u nastavku).

Algoritam Shunting Yard

Shunting Yard je algoritam linearne složenosti preko koga se infiksni izraz prvo svodi na 'posrednički oblik', * nakon čega tipično sledi postupak računanja vrednosti:

  • u prvom prolasku (kroz infiksni izraz), kreira se postfiksni zapis ili stablo izraza *
  • u drugoj etapi, računa se vrednost izraza (prolaskom kroz izraz u postfiksnoj notaciji, ili, postorder obilaskom stabla izraza)

* U ovom članku i sledećem, bavićemo se uobičajenijom varijantom algoritma, što podrazumeva prevođenje izraza iz infiksne notacije u postfiksnu, međutim, kao što smo naveli, postoji i mogućnost kreiranja i upotrebe stabla izraza (čemu ćemo posvetiti zaseban članak).

Pri prevođenju infiksnog izraza u postfiksni, koriste se tri strukture podataka:

  • lista tokena (čiji su elementi poređani tako da predstavljaju početni (infiksni) izraz)
  • stek za operatore (preko koga se operatori iz ulaznog izraza razvrstavaju shodno prioritetu)
  • red za čekanje (u koji se smeštaju tokeni koji su u potpunosti obrađeni)
Shunting Yard - početna situacija
Slika 1. - Shunting yard - Primer početne situacije (infiksni izraz je pretvoren u listu tokena i može se početi sa kreiranjem postfiksnog oblika notacije).

Moguće putanje tokena su sledeće:

  • operandi iz liste mogu se prebacivati samo u red za čekanje
  • operatori iz liste mogu se prebacivati samo na stek ("sporedni kolosek") *
  • operatori sa steka mogu se prebacivati samo u red za čekanje

* Šema koju vidimo na gornjoj slici, podseća na 'ranžirne stanice' (prostrana dvorišta za razmeštanje lokomotiva i vagona na većim železničkim stanicama), a naziv za takvo dvorište, na engleskom jeziku, je (pogađate) - shunting yard.

Algoritam podrazumeva da se svi tokeni (tj. celine u izrazu, od kojih svaka predstavlja pojedinačni operand ili operator), premeste iz osnovne liste tokena - u red za čekanje.

Na kraju, sadržaj reda za čekanje predstavlja izraz u postfiksnoj notaciji - i sve se obavlja u jednom prolasku kroz izraz.

Pravila za premeštanje tokena

Premeštanje tokena, iz (početne) liste tokena - u red za čekanje (koji predstavlja postfiksni izraz), obavlja se prema sledećim pravilima:

  • ukoliko je iz liste preuzet token koji predstavlja operand, navedeni token se direktno prebacuje u red za čekanje
  • ukoliko je iz liste preuzet token koji predstavlja operator (jedan od znakova operacije ili zagradu), navedeni token se postavlja na stek, prema sledećim pravilima:
    • ukoliko je stek prazan ili je na vrhu steka otvorena zagrada, bilo koji operator iz liste (osim zatvorene zagrade), direktno se smešta na vrh steka
    • ukoliko je iz liste preuzeta otvorena zagrada, token ( se smešta direktno na vrh steka bez obzira na prethodni sadržaj steka
    • ukoliko je iz liste preuzet token + ili -, a pri tom je na vrhu steka operator istog ili višeg prioriteta, prvo se operator sa vrha steka prosleđuje u red za čekanje, i tek onda se operator preuzet iz liste tokena smešta na vrh steka (osim u slučaju koji će biti opisan odmah ispod)
    • ukoliko je u prethodnoj situaciji (kada se iz osnovne liste preuzima + ili -), u red za čekanje prvo prebačen operator * ili / sa vrha steka - posle čega se na vrhu steka pojavio operator + ili - (ubačen u nekom od ranijih koraka) - potrebno je u red prebaciti i taj (drugi) token sa vrha steka (operator + ili -), pre nego što se na vrh steka smesti token + ili - koji se preuzima iz liste
    • ukoliko se iz liste preuzima token * ili /, a na vrhu steka je operator nižeg prioriteta (+ ili -), operator iz liste stavlja se na stek direktno (upravo je to razlog zašto se, u prethodnom koraku, ispod operatora * ili / mogao naći operator + ili -)
    • ukoliko se iz liste preuzima token * ili /, a na vrhu steka je operator istog prioriteta, prvo se operator sa vrha steka prosleđuje u red za čekanje, posle čega se operator preuzet iz liste smešta na vrh steka
    • ukoliko se iz liste tokena preuzme operator ) (zatvorena zagrada), sama zatvorena zagrada se zanemaruje, * a operatori sa vrha steka premeštaju se redom (jedan po jedan), iz steka - u red za čekanje, sve dok na vrhu steka ne ostane otvorena zagrada - posle čega se otvorena zagrada takođe uklanja sa vrha steka (ali ne premešta se u red)

Kada se lista tokena isprazni, proverava se stek, pri čemu važe sledeća pravila:

  • ukoliko je stek prazan, izraz je rešen
  • ukoliko stek nije prazan, operatori sa steka se premeštaju redom (jedan po jedan), iz steka - u red za čekanje - nakon čega je izraz rešen

Uz praćenje navedenih uputstava, svaki token iz liste tokena (koji dospe na obradu), rešava se odmah i ne vraća se nazad u listu - čime se postiže linearna složenost algoritma, a moguće je 'usput' ustanoviti i da li postoje greške u zapisu infiksnog izraza. **

* Zatvorena zagrada se "zanemaruje" = ne premešta se na stek (niti u red za čekanje).

** Stanje steka ili reda za čekanje (u određenim trenucima tokom interpretacije izraza), ukazuje na to da li u početnom izrazu postoji 'višak ili manjak' tokena.

U ovom članku (i u prvom delu narednog članka), posmatraćemo korektno zapisane izraze (da bismo se upoznali sa osnovnim postupcima), ali, prikazaćemo, na kraju članka #2, kako se algoritamskim putem može ustanoviti pojava grešaka.

Praktični primeri

Pravila koja su navedena u prethodnom odeljku mogu delovati komplikovano na početku, ali, zapravo je u pitanju prilično intuitivan algoritam, odnosno, u praksi je dovoljno proći kroz izvestan broj izraza, posle čega verujemo da će čitaocima sva pravila postati jasna u potpunosti.

Zarad 'uvodnog razjašnjavanja', * razmotrićemo dva primera: jednostavan izraz bez zagrada, i izraz sa zagradama (koji obuhvata većinu navedenih pravila).

* Verujemo (i nadamo se) da će uvodni primeri biti dovoljni za početno upoznavanje, ali, svakako preporučujemo da, nakon proučavanja primera koje ćemo prikazati, samostalno razradite .... 'malo više od dva primera'. :)

(Recimo, 20-30 kompleksnijih primera, koje ćete rešavati umerenim tempom, trebalo bi da bude dovoljno za dostizanje potpunog razumevanja.)

Primer #1 - Jednostavan izraz bez zagrada

U prvom primeru koristićemo sledeći početni infiksni izraz:

a + b * c

Prvi token predstavlja operand (promenljivu ili brojčanu vrednost):

Shunting Yard prevođenje 01
Slika 2. - Shunting yard - Primer #1 - Početna situacija (prvi token za obradu je operand).

Shodno pravilima, token se premešta direktno u red.

Shunting Yard prevođenje 02
Slika 3. - Shunting yard - Primer #1 - Korak 1. - Token je prebačen direktno u red za čekanje.

Sledeći token (operator +) ....

Shunting Yard prevođenje 03
Slika 4. - Shunting yard - Primer #1 - Korak 2. - Token za obradu je operator.

.... postavlja se na vrh steka (koji je prethodno bio prazan):

Shunting Yard prevođenje 04
Slika 5. - Shunting yard - Primer #1 - Korak 3. - Budući da je stek prazan, token se može postaviti direktno na vrh steka.

Treći token (operand b) ....

Shunting Yard prevođenje 05
Slika 6. - Shunting yard - Primer #1 - Korak 4. - Token za obradu je operand.

.... direktno se prosleđuje u red:

Shunting Yard prevođenje 06
Slika 7. - Shunting yard - Primer #1 - Korak 5. - Token je prebačen direktno u red za čekanje.

Operator množenja ....

Shunting Yard prevođenje 07
Slika 8. - Shunting yard - Primer #1 - Korak 6. - Token za obradu je operator.

.... može se postaviti na vrh steka, shodno pravilima, s obzirom na to da operator koji je već na vrhu steka (+), ima niži prioritet:

Shunting Yard prevođenje 08
Slika 9. - Shunting yard - Primer #1 - Korak 7. - Budući da je na vrhu steka operacija nižeg prioriteta, token se može dodati na vrh steka.

Operand c ....

Shunting Yard prevođenje 09
Slika 10. - Shunting yard - Primer #1 - Korak 8. - Token za obradu je operand.

.... direktno se prosleđuje u red:

Shunting Yard prevođenje 10
Slika 11. - Shunting yard - Primer #1 - Korak 9. - Token je direktno prosleđen u red za čekanje.

Lista tokena je sada prazna, i - kada bi i stek bio prazan - izraz bi bio rešen.

Međutim, pošto u ovom slučaju stek nije prazan, potrebno je da tokeni sa steka budu premešteni u red za čekanje.

Da se podsetimo: posle prolaska kroz listu tokena, tokeni sa vrha steka prebacuju se u red, jedan-po-jedan, sve dok se stek ne isprazni.

Prvi na redu je operator sa vrha steka, operator * ....

Shunting Yard prevođenje 11
Slika 12. - Shunting yard - Primer #1 - Korak 10. - Budući da je lista tokena ispražnjena, potrebno je isprazniti i stek (to jest, prebaciti tokene u red za čekanje). Prvi na redu je token operacije množenja.

.... koji se u sledećem koraku premešta na kraj reda ....

Shunting Yard prevođenje 12
Slika 13. - Shunting yard - Primer #1 - Korak 11. - Token operacije množenja prebačen je u red za čekanje.

.... posle čega ostaje operator sabiranja + ....

Shunting Yard prevođenje 13
Slika 14. - Shunting yard - Primer #1 - Korak 12. - Na steku preostaje token operacije sabiranja, koji će takođe biti prebačen u red za čekanje.

.... koji se takođe premešta u red:

Shunting Yard prevođenje 14
Slika 15. - Shunting yard - Primer #1 - Korak 13. - Token operacije sabiranja je takođe prebačen u red za čekanje.

Posle svih operacija, lista tokena je potrošena, stek je prazan ....

Shunting Yard prevođenje 15
Slika 16. - Shunting yard - Primer #1 - Rešen izraz.

.... što znači da je izraz rešen.

Primer #2 - Složeniji izraz sa zagradama

U drugom primeru, prebacićemo u postfiksnu notaciju sledeći infiksni izraz:

a * (b + c - d)

Shunting Yard prevođenje 16
Slika 17. - Shunting yard - Primer #2 (izraz sa zagradama) - Početna situacija.

Prvi token (operand) ....

Shunting Yard prevođenje 17
Slika 18. - Shunting yard - Primer #2 - Korak 1. - Token za obradu je operand.

.... direktno se prosleđuje u red za čekanje:

Shunting Yard prevođenje 18
Slika 19. - Shunting yard - Primer #2 - Korak 2. - Token je prebačen direktno u red za čekanje.

Operator množenja ....

Shunting Yard prevođenje 19
Slika 20. - Shunting yard - Primer #2 - Korak 3. - Token za obradu je operator.

.... postavlja se na prazan stek:

Shunting Yard prevođenje 20
Slika 21. - Shunting yard - Primer #2 - Korak 4. - Budući da je stek prazan, token se može smestiti direktno na vrh steka.

Otvorena zagrada ....

Shunting Yard prevođenje 21
Slika 22. - Shunting yard - Primer #2 - Korak 5. - Token za obradu je otvorena zagrada.

.... može se staviti preko bilo kog operatora na steku (kao i na prazan stek inače):

Shunting Yard prevođenje 22
Slika 23. - Shunting yard - Primer #2 - Korak 6. - Otvorena zagrada se može bezuslovno smestiti direktno na vrh steka.

Operand b ....

Shunting Yard prevođenje 23
Slika 24. - Shunting yard - Primer #2 - Korak 7. - Token za obradu je operand.

.... direktno se prosleđuje u red:

Shunting Yard prevođenje 24
Slika 25. - Shunting yard - Primer #2 - Korak 8. - Token je prosleđen direktno u red za čekanje.

Operator sabiranja ....

Shunting Yard prevođenje 25
Slika 26. - Shunting yard - Primer #2 - Korak 9. - Token za obradu je operator.

.... može se smestiti na stek (preko otvorene zagrade):

Shunting Yard prevođenje 26
Slika 27. - Shunting yard - Primer #2 - Korak 10. - Budući da je na vrhu steka otvorena zagrada, token operacije sabiranja može se smestiti na vrh steka.

Operand c ....

Shunting Yard prevođenje 27
Slika 28. - Shunting yard - Primer #2 - Korak 11. - Token za obradu je operand.

.... direktno se prosleđuje u red:

Shunting Yard prevođenje 28
Slika 29. - Shunting yard - Primer #2 - Korak 12. - Token je direktno prosleđen u red za čekanje.

Operator oduzimanja ....

Shunting Yard prevođenje 29
Slika 30. - Shunting yard - Primer #2 - Korak 13. - Token za obradu je operator oduzimanja.

.... ne može se direktno smestiti na vrh steka, jer na vrhu steka stoji operator istog prioriteta:

Shunting Yard prevođenje 30
Slika 31. - Shunting yard - Primer #2 - Korak 14. - Na vrhu steka nalazi se token operacije istog prioriteta, i stoga se prvo token sa vrha steka mora premestiti u red za čekanje.

Prvo je potrebno prebaciti operator sabiranja u red za čekanje ....

Shunting Yard prevođenje 31
Slika 32. - Shunting yard - Primer #2 - Korak 15. - Token sa vrha steka je prebačen u red za čekanje.

.... i tek potom se operator oduzimanja može smestiti na vrh steka:

Shunting Yard prevođenje 32
Slika 33. - Shunting yard - Primer #2 - Korak 16. - Token za obradu je sada dodat na vrh steka.

Operand d ....

Shunting Yard prevođenje 33
Slika 34. - Shunting yard - Primer #2 - Korak 17. - Token za obradu je operand.

.... biće (po pravilu za operande), direktno prosleđen u red:

Shunting Yard prevođenje 34
Slika 35. - Shunting yard - Primer #2 - Korak 18. - Token je direktno prosleđen u red za čekanje.

Pojava zatvorene zagrade ....

Shunting Yard prevođenje 35
Slika 36. - Shunting yard - Primer #2 - Korak 19. - Token za obradu je zatvorena zagrada, što znači da se tokeni sa vrha steka prebacuju u red za čekanje (redom, jedan-po-jedan), sve dok se na vrhu steka ne pojavi otvorena zagrada.

.... pokrenuće pražnjenje steka do prve prethodno ubačene otvorene zagrade ....

Shunting Yard prevođenje 36
Slika 37. - Shunting yard - Primer #2 - Korak 20. - Token sa vrha steka (operator oduzimanja), biće prebačen u red za čekanje.

.... što praktično znači da će operator oduzimanja (kao jedini operator 'između dve zagrade'), biti prosleđen u red za čekanje ....

Shunting Yard prevođenje 37
Slika 38. - Shunting yard - Primer #2 - Korak 21. - Operator oduzimanja prebačen je u red za čekanje.

.... posle čega će otvorena zagrada ....

Shunting Yard prevođenje 38
Slika 39. - Shunting yard - Primer #2 - Korak 22. - Otvorena zagrada na vrhu steka (koja odgovara zatvorenoj zagradi koja je token za obradu), biće uklonjena sa vrha steka.

.... biti obrisana sa vrha steka ....

Shunting Yard prevođenje 39
Slika 40. - Shunting yard - Primer #2 - Korak 23. - Otvorena zagrada je uklonjena sa vrha steka.

.... a zatvorena zagrada (koja je pokrenula (delimično) pražnjenje steka) ....

Shunting Yard prevođenje 40
Slika 41. - Shunting yard - Primer #2 - Korak 24. - Pošto je sa vrha steka uklonjena otvorena zagrada, token za obradu (zatvorena zagrada), može se ukloniti.

.... jednostavno se zanemaruje: *

Shunting Yard prevođenje 41
Slika 42. - Shunting yard - Primer #2 - Korak 25. - Zatvorena zagrada je uklonjena iz liste tokena.

* Kao što smo već objasnili, zatvorena zagrada povlači pražnjenje steka - do pojave otvorene zagrade, ali, sama po sebi, zatovrena zagrada se naprosto uklanja iz početne liste tokena (tj. ne premešta se na stek ili u red za čekanje).

Na kraju, pošto su tokeni istrošeni - a stek nije prazan ....

Shunting Yard prevođenje 42
Slika 43. - Shunting yard - Primer #2 - Korak 26. - Budući da je lista tokena ispražnjena - pri čemu stek nije prazan - operatori sa steka (u ovom slučaju samo operator množenja), biće prebačen(i) u red za čekanje.

.... sadržaj steka (u ovom slučaju, samo jedan operator), biće prebačen u red ....

Shunting Yard prevođenje 43
Slika 44. - Shunting yard - Primer #2 - Korak 27. - Operator množenja je prebačen u red za čekanje.

.... posle čega je izraz rešen.

Shunting Yard prevođenje 44
Slika 45. - Shunting yard - Primer #2 - Rešen izraz - svi tokeni su prebačeni u red za čekanje.

Implementacija metode za prebacivanje izraza iz infiksne notacije u postfiksnu notaciju

U implementaciji metode za prebacivanje izraza iz infiksne notacije u postfiksnu notaciju, smatraćemo (zarad preglednosti i jednostavnosti), da svaki pojedinačni karakter iz ulazne niske predstavlja token, i takođe ćemo podrazumevati da je izraz pravilno zapisan * (pri čemu su razmaci u izrazu dozvoljeni).

		
private void dodavanjePlusMinus(char c, Stack<char> stek, Queue<char> red)
{
    if (stek.Peek() == '(' || stek.Peek() == '?') {
        stek.Push(c);
    }
    else {
        while (stek.Peek() == '+' || stek.Peek() == '-' ||
               stek.Peek() == '*' || stek.Peek() == '/')
        {
            red.Enqueue(stek.Pop());
        }
        stek.Push(c);
    }
 }

private void dodavanjePutaKroz(char c, Stack<char> stek, Queue<char> red)
{
    if (stek.Peek() == '(' || stek.Peek() == '?' ||
        stek.Peek() == '+' || stek.Peek() == '-')
    {
        stek.Push(c);
    }
    else {
        while (stek.Peek() == '/' || stek.Peek() == '*') {
            red.Enqueue(stek.Pop());
        }
        stek.Push(c);
    }
}

private void dodavanjeZatvorenaZagrada(char c, Stack<char> stek, Queue<char> red)
{
    while (stek.Peek() != '(') {
        red.Enqueue(stek.Pop());
    }

    stek.Pop();
}

private string Parse(string s)
{
    Int32 i, d = s.Length;
    String str = "";
    Queue<char> red = new Queue<char>();
    Stack<char> stek = new Stack<char>();
    stek.Push('?');
    
    for (i = 0; i < d; i++) {
        char c = s[i];

        if (c >= 97 && c <= 122) {
            red.Enqueue(c);
        }
        else {
            switch (c) {
                case '(': stek.Push(c); break;
                case '+':
                case '-': dodavanjePlusMinus(c, stek, red); break;
                case '*':
                case '/': dodavanjePutaKroz(c, stek, red); break;
                case ')': dodavanjeZatvorenaZagrada(c, stek, red); break;
                default: break;
             }
        }
    }

    while (stek.Peek() != '?') red.Enqueue(stek.Pop());
    ProcenaVrednosti(red);
    while (red.Count > 0) str += red.Dequeue().ToString();
    return str;
}
		
	
Slika 46. - Implementacija metode za prevođenje infiksne notacije u postfiksnu notaciju.

* Drugim rečima, prepustićemo čitaocima da sami (za vežbu) implementiraju delove koda koji se tiču provere validnosti izraza (osnovne ideje objašnjene su u ovom članku, a u narednom članku će biti detaljnije objašnjena pravila za proveru izraza (u smislu uparenosti zagrada i viška ili manjka operatora i/ili operanada)).

Kao što vidimo, osnovni algoritam (bez provere), implementira se u vidu jednostavne petlje koja redom prolazi kroz tokene i rešava svaki token "u mestu":

  • preko switch grananja, znak (odnosno token) koji je dospeo na obradu, uparuje se sa jednom od kategorija tokena koje se prepoznaju
  • u zavisnosti od sadržaja tokena, poziva se jedna od radnih metoda za rešavanje pojedinačnih kategorija tokena (pri čemu su takve metode, kao što smo videli, gotovo direktna implementacija pravila koja su navedena na početku)

Dalji koraci ....

Prebacivanje izraza iz infiksne notacije u postfiksnu notaciju, prvi je korak u računanju vrednosti izraza.

U sledećem članku koji je posvećen implementaciji algoritma Shunting Yard, predstavićemo deo algoritma koji je zadužen za računanje vrednosti izraza (i prikazaćemo implementaciju).

Autor članka Nikola Vukićević Za web portal codeblog.rs
Napomena: Tekstovi, slike, web aplikacije i svi ostali sadržaji na sajtu codeblog.rs (osim u slučajevima gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog pismenog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook LinkedIn Twitter Viber WhatsApp E-mail
početna > Članci > Shunting Yard - Implementacija - 1. deo - Prevođenje izraza iz infiksnog zapisa u postfiksni
codeBlog codeBlog
Sajt posvećen popularizaciji kulture i veštine programiranja.
Napomena: Tekstovi i slike na sajtu codeblog.rs (osim u slučajevima, gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog odobrenja autora.
© 2020-2026. Sva prava zadržana.
Facebook - logo
Instagram - logo
LinkedIn - logo
Twitter - logo
E-mail
Naslovna
   •
Uslovi korišćenja
   •
Obaveštenja
   •
FAQ
   •
Kontakt