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: 24.11.2020.

trejler_olovka Poslednja izmena: 10.08.2025.

trejler_dokument Jezici: ----

trejler_teg_narandzasti Težina: 9/10

algoritam
stablo izraza
ast
apstraktno sintaksno stablo
strukture podataka
dfs
postfiksna notacija
shunting yard
edsger dijkstra
dijkstra
teorija

Tema: Shunting yard

Postfiksna notacija - kako računari računaju?Implementacija - 1. deo - Prevođenje izraza iz infiksnog u postfiksni zapisImplementacija - 2. deo - Računanje vrednosti postfiksnog izraza
Generator stabla izraza (web aplikacija)

Povezani članci

Visinski balansirano (AVL) stabloAVL Stablo - Implementacija - 1. deo - Osnovna strukturaBFS i DFS - Pronalaženje putanje kroz lavirintBinarno stablo pretrageUvod u objektno orijentisano programiranjeKlase složenosti algoritama (O notacija)Strukture podatakaUvod u dinamičko programiranjeIzbor prvog programskog jezika
Svi članci
A computer is like a mischevious genie. It will give you exactly what you ask for, but not always what you want
Joe Sondow

Binarna stabla i algebarski izrazi (stablo izraza)

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

Uvod

U uvodnom članku o postfiksnoj notaciji nagovestili smo da algoritam Shunting Yard ima važnu ulogu u prevođenju programskih jezika, a u prvom članku o implementaciji algoritma Shunting Yard, naveli smo da postoji i varijanta algoritma koja omogućava kreiranje stabla izraza - umesto postfiksnog zapisa.

Stablo izraza je razgranata struktura podataka preko koje se predstavlja apstraktni oblik određenog algebarskog izraza, pri čemu je takva 'uopštena šema izraza', istovremeno: nezavisna od različitih oblika notacije o kojima smo ranije diskutovali i (na posredan način) - povezana sa sva tri.

U širem kontekstu, stabla izraza su podvrsta sintaksnih stabala opšteg tipa, preko kojih se (pri prevođenju programskog koda), struktura programa (ili delova programa, pojedinačnih naredbi, izraza i sl), predstavlja u obliku stabla. *

Sasvim je jasno da se radi o veoma zanimljivoj pojavi (kojoj ćemo u nekom trenutku posvetiti jedan ili više članaka), a uvod u nešto kompleksniju strukturu sintaksnih stabala biće članak koji je pred nama, u kome ćemo se za početak baviti nešto jednostavnijim razgranatim strukturama koje su specifično namenjene predstavljanju algebarskih izraza ....

* U sintaksnom stablu koje se koristi za predstavljanje strukture računarskog programa, tokeni imaju sledeće značenje: koren stabla označava početak izvršavanja programa, čvorovi sa potomcima predstavljaju grananja u programu, listovi predstavljaju instrukcije u određenom opsegu (a pri tom je prisutna i poveća količina dodatnih informacija).

Strukturu stabala izraza (koja je ipak primetno jednostavnija), proučavaćemo u nastavku ....

Stabla izraza - opšte ideje

Sa stablima izraza upoznali smo okvirno još u članku o postfiksnoj notaciji:

Binarna stabla i algebarski izrazi 01
Slika 1. - Primer stabla izraza.

Stablo sa slike (da se podsetimo), predstavlja infiksni izraz (a+b*c)/d, ali - isto tako - i prefiksni izraz /+a*bcd, kao i postfiksni izraz abc*+d/.

Može se primetiti i to da su operatori (tamniji čvorovi), međusobno povezani u svojevrsno "unutrašnje stablo", i (naravno), povezani su sa listovima koji predstavljaju operande, a takođe je jasno da operand (tj. broj ili promenljiva), u stablu izraza može predstavljati samo 'list'.

Ili (drugim rečima): operandi ne mogu stajati u korenu (pod)stabala, osim ukoliko nisu u pitanju operandi koji predstavljaju 'listove'.

Postorder obilazak unutrašnjeg stabla operatora određuje redosled izvršavanja operacija, i stoga: ukoliko se svaka od operacija primeni na licu mesta (onda kada dođe na red za izvršavanje), i ako se potom podstablo u čijem korenu stoji znak operacije zameni čvorom koji predstavlja izračunatu vrednost - celo stablo može se svesti na jedan čvor -- koji predstavlja vrednost izraza. *

Preko tri različite varijante DFS obilazaka (inorder, preorder i postorder), po potrebi se može rekonstruisati infiksni, prefiksni ili postfiksni zapis izraza.

* Doduše, 'urušavanje stabla' (koje smo opisali), najčešće nije najbolji izbor u praktičnom smislu, ali, time ćemo se detaljnije pozabaviti pred kraj članka.

Pretvaranje infiksnog izraza u stablo izraza

Iako postoje i druge opcije, stabla izraza najčešće nastaju: ili pretvaranjem infiksnog izraza u stablo izraza, ili pretvaranjem postfiksnog (ili prefiksnog izraza) u stablo izraza.

Za početak, upoznaćemo se sa postupkom koji se može shvatiti kao 'najprirodniji i najuobičajeniji' (iako ne i najlakši): za zadati infiksni izraz - kreiraćemo stablo izraza.

U sledećem poglavlju razmotrićemo i jednostavniju opciju: pretvaranje (već postojećeg) postfiksnog zapisa u stablo izraza.

Pretvaranje infiksnog izraza u apstraktno stablo izvešćemo preko algoritma Shunting Yard, ali, ovoga puta, za smeštaj rezultata neće biti korišćen red za čekanje (niti bi to bilo moguće). Umesto reda za čekanje, rezultat(i) se smešta(ju) na poseban stek.

Dakle, varijanta algoritma Shunting Yard preko koje nastaje stablo izraza, koristi - umesto pomoćnog steka i reda za čekanje (queue) - ukupno dva steka:

  • stek za operatore *
  • stek za stabla

* U idejnom i tehničkom smislu, stek za operatore je isti kao i do sada ("sporedni kolosek").

Iako implementacija steka za stabla može na prvi pogled delovati i pomalo "zastrašujuće" (zbog nepoznate strukture "svih mogućih oblika stabala izraza koja se smeštaju na takav stek"), u praksi je stvar (srećom) mnogo jednostavnija.

Struktura podataka preko koje se može referencirati celo stablo, u osnovnom (tehničkom) smislu je zapravo običan pokazivač (ili referenca) na koren stabla:

  • sam koreni čvor stabla izraza može biti bez 'potomaka' (u tom slučaju se celo stablo svodi na samo jedan operand/promenljivu/brojčanu vrednost)
  • koreni čvor (operator), može imati dva potomka, koji takođe (sami po sebi) mogu biti reference na koren nekog drugog stabla (u tom slučaju, referenca na koreni čvor predstavlja pravo 'razgranato' stablo izraza)

U članku o strukturama podataka već smo pominjali da referenca na celo stablo može biti zapisana u vidu običnog pokazivača na čvor (a slično smo ponovili i u članku o implementaciji ulančane liste u C++-u), međutim, na oba mesta osvrnuli smo se i na to da optimalan pristup pri implementaciji strukture stabla podrazumeva da referenca na koreni čvor stabla 'ipak' bude zapisana kao jedno od polja klase.

U svakom slučaju, dovoljno je na stek smestiti samo referencu na koreni čvor bilo kog (pod)stabla, bez preterane brige o tome kako je celokupno stablo zapravo zapisano u memoriji (što svakako čini stek sa stablima znatno preglednijim).

Pravila za pretvaranje infiksnog izraza u stablo izraza

Varijanta algoritma Shunting Yard za kreiranje stabla izraza, vrlo je slična osnovnom algoritmu za kreiranje postfiksnog zapisa (sasvim očekivano), ali, u praktičnom smislu se može reći da pravila koja ćemo navesti u nastavku zapravo predstavljaju svojevrsnu kombinaciju delova algoritma za prebacivanje izraza u postfiksnu notaciju i algoritma za računanje vrednosti postfiksnog izraza (sa kojim smo se takođe upoznali):

  • ako je token koji se preuzima i izbacuje iz reda - operand, potrebno je napraviti referencu na koreni čvor novog stabla (koje se sastoji samo od korenog čvora koji predstavlja operand), i potom treba prebaciti stablo direktno na stek za stabla
  • ako je token koji se preuzima i izbacuje iz reda - zagrada ili znak operacije (tj. operator), token se smešta na stek za operatore (na pomoćni stek kakav smo koristili i u prethodnoj implementaciji), pri čemu se primenjuju ista pravila za smeštanje operatora na pomoćni stek kao i u prethodnoj implementaciji (na prazan stek je moguće staviti bilo koji operator, otvorena zagrada stavlja se na stek bezuslovno, zatvorena zagrada povlači pražnjenje steka, a u ostalim situacijama se vodi računa o prioritetu operatora)
  • kada je vreme da se sa pomoćnog steka ukloni operator, token se ne prebacuje u stek za stabla direktno, već se sprovodi procedura za kreiranje stabla koje odgovara tokenu operacije:
    • sa vrha steka za stabla skidaju se dva stabla (ona stabla koja odgovaraju operatoru)
    • formira se novo stablo (od operatora i dva preuzeta stabla)
    • novo stablo se postavlja na vrh steka za stabla

Primer pretvaranja infiksnog izraza u stablo izraza

Za upoznavanje sa postupkom pretvaranja infiksnog izraza u stablo izraza, koristićemo sledeći jednostavni infiksni izraz ....

		
(a + b * c) / d
		
	
Slika 2. - Infiksni izraz koji će biti korišćen kao primer u članku.

.... koji odgovara stablu sa slike #1.

Na početku, elemente izraza prvo treba pretvoriti u tokene i smestiti u red za čekanje ....

Binarna stabla i algebarski izrazi 03
Slika 3. - Šema algoritma za pretvaranje infiksnog izraza u stablo izraza - početna situacija.

.... nakon čega sledi obrada tokena.

Otvorena zagrada ....

Binarna stabla i algebarski izrazi 04
Slika 4. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 1.

.... smešta se na stek za operatore:

Binarna stabla i algebarski izrazi 05
Slika 5. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 2.

Operand a ....

Binarna stabla i algebarski izrazi 06
Slika 6. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 3.

.... smešta se na stek za stabla.

Binarna stabla i algebarski izrazi 07
Slika 7. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 4.

U implementaciji, potrebno je (naravno) kreirati stablo izraza koje ima samo koreni čvor, čiji je sadržaj - operand a.

Nastavljamo dalje ....

Operator sabiranja ....

Binarna stabla i algebarski izrazi 08
Slika 8. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 5.

.... smešta se na stek za operatore:

Binarna stabla i algebarski izrazi 09
Slika 9. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 6.

Operand b ....

Binarna stabla i algebarski izrazi 10
Slika 10. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 7.

.... prebacuje se (u vidu novog stabla sa jednim čvorom), na stek sa stablima:

Binarna stabla i algebarski izrazi 11
Slika 11. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 8.

Operator množenja ....

Binarna stabla i algebarski izrazi 12
Slika 12. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 9.

.... smešta se na vrh steka za operatore. *

Binarna stabla i algebarski izrazi 13
Slika 13. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 10.

* Da se podsetimo ukratko: još u prvom članku o implementaciji algoritma Shunting yard upoznali smo se sa time da je dozvoljeno da se operator množenja ili deljenja postavi na stek preko operatora sabiranja ili oduzimanja.

U nastavku, pretposlednji operand, token c ....

Binarna stabla i algebarski izrazi 14
Slika 14. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 11.

.... prebacuje se na stek sa stablima ....

Binarna stabla i algebarski izrazi 15
Slika 15. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 12.

.... nakon čega algoritam nailazi na zatvorenu zagradu:

Binarna stabla i algebarski izrazi 16
Slika 16. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 13.

U pitanju je operator čija pojava (takođe prema pravilima sa kojima smo se detaljno upoznali u člancima o algoritmu Shunting Yard), povlači pražnjenje steka sve do prve otvorene zagrade:

Binarna stabla i algebarski izrazi 17
Slika 17. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 14.

Prema pravilima za formiranje stabla izraza (sa kojima smo se upoznali u ovom članku), operator sa vrha steka za operatore, uparuje se sa dva stabla sa vrha steka za stabla ....

Binarna stabla i algebarski izrazi 18
Slika 18. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 15.

.... sva tri elementa se uklanjaju sa stekova i formira se novo stablo ....

Binarna stabla i algebarski izrazi 19
Slika 19. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 16.

.... i potom se novo stablo vraća na stek za stabla:

Binarna stabla i algebarski izrazi 20
Slika 20. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 17.

Isti postupak ponavlja se i kada na red dođe operator sabiranja:

Binarna stabla i algebarski izrazi 21
Slika 21. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 18.

Operator sabiranja uparuje se sa gornja dva stabla na vrhu steka za stabla ....

Binarna stabla i algebarski izrazi 22
Slika 22. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 19.

.... sva tri elementa se uklanjaju sa stekova, formira se novo stablo ....

Binarna stabla i algebarski izrazi 23
Slika 23. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 20.

.... i potom se novo stablo smešta na vrh steka za stabla:

Binarna stabla i algebarski izrazi 24
Slika 24. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 21.

Otvorena zagrada sa vrha steka za operatore ....

Binarna stabla i algebarski izrazi 25
Slika 25. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 22.

.... sada se može ukloniti ....

Binarna stabla i algebarski izrazi 26
Slika 26. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 23.

.... a pošto su zagrade rešene, algoritam se vraća na red sa tokenima.

Operator deljenja (sledeći token) ....

Binarna stabla i algebarski izrazi 27
Slika 27. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 24.

.... smešta se direktno na prazan stek za operatore:

Binarna stabla i algebarski izrazi 28
Slika 28. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 25.

Preostali token, operand d ....

Binarna stabla i algebarski izrazi 29
Slika 29. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 26.

.... smešta se na stek sa stablima:

Binarna stabla i algebarski izrazi 30
Slika 30. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 27.

Budući da je red sa tokenima ispražnjen - a stek sa operatorima nije - potrebno je isprazniti stek sa operatorima. *

Binarna stabla i algebarski izrazi 31
Slika 31. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 28.

* U primeru koji razmatramo, preostao je samo operator deljenja koji je maločas ubačen.

Operator sa vrha steka za operatore, uparuje se sa dva stabla sa vrha steka za stabla ....

Binarna stabla i algebarski izrazi 32
Slika 32. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 29.

.... potom se sva tri elementa uklanjaju sa stekova i formira se novo stablo ....

Binarna stabla i algebarski izrazi 33
Slika 33. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Korak 30.

.... i na kraju se stablo vraća na vrh steka sa stablima.

Binarna stabla i algebarski izrazi 34
Slika 34. - Postupak za pretvaranje infiksnog izraza u stablo izraza - Krajnji rezultat (stablo izraza se nalazi na vrhu steka sa stablima).

Budući da je sada i stek sa operatorima ispražnjen, izraz je rešen, a stablo izraza se nalazi na vrhu steka.

Pretvaranje postfiksnog izraza u stablo izraza

Za pretvaranje postfiksnog izraza u stablo izraza, postupak je još jednostavniji (kao što smo već nagovestili), i pri tom se kao pomoćna struktura podataka koristi samo jedan stek.

Pravila za pretvaranje postfiksnog izraza u stablo izraza

Postupak se sastoji iz sledećih koraka:

  • ako je token koji se preuzima i uklanja iz reda - operand, token se smešta direktno na stek za stabla, * u vidu stabla sa jednim čvorom
  • ako je token koji se preuzima i uklanja iz reda - operator, sledi postupak koji podrazumeva da se sa steka uklanjaju gornja dva stabla nakon čega se od tri navedena elementa formira novo stablo (operator je koren novog stabla, a dva stabla preuzeta sa steka predstavljaju levo i desno podstablo)
  • novoformirano stablo se potom vraća na stek
  • kada se isprazni red sa tokenima i kada se završe sve operacije, na vrhu steka ostaje stablo izraza

* U daljem tekstu, (samo) "stek".

Pogledajmo i konkretan primer ....

Primer pretvaranja postfiksnog izraza u stablo izraza

Za primer ćemo uzeti postfiksni izraz abc*+ (koji odgovara infiksnom izrazu: a + b * c):

Binarna stabla i algebarski izrazi 35
Slika 35. - Šema algoritma za pretvaranje postfiksnog izraza u stablo izraza - Početna situacija.

Operand a ....

Binarna stabla i algebarski izrazi 36
Slika 36. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 1.

.... smešta se na stek sa stablima:

Binarna stabla i algebarski izrazi 37
Slika 37. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 2.

Operand b ....

Binarna stabla i algebarski izrazi 38
Slika 38. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 3.

.... smešta se na stek sa stablima:

Binarna stabla i algebarski izrazi 39
Slika 39. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 4.

Poslednji operand, operand c ....

Binarna stabla i algebarski izrazi 40
Slika 40. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 5.

.... takođe se smešta na stek sa stablima:

Binarna stabla i algebarski izrazi 41
Slika 41. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 6.

Pojava operatora množenja (sledećeg tokena po redu) ....

Binarna stabla i algebarski izrazi 42
Slika 42. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 7.

.... praktično pokreće kreiranje podstabla, što znači da se operator uparuje sa gornja dva elementa sa steka ....

Binarna stabla i algebarski izrazi 43
Slika 43. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 8.

.... od tri navedena elementa formira se novo stablo ....

Binarna stabla i algebarski izrazi 44
Slika 44. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 9.

.... i potom se novo stablo vraća nazad na stek:

Binarna stabla i algebarski izrazi 45
Slika 45. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 10.

Pojava operatora sabiranja ....

Binarna stabla i algebarski izrazi 46
Slika 46. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 11.

.... ponovo pokreće postupak po istom obrascu: operator se uparuje sa dva stabla sa vrha steka ....

Binarna stabla i algebarski izrazi 47
Slika 47. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 12.

.... formira se novo stablo ....

Binarna stabla i algebarski izrazi 48
Slika 48. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Korak 13.

.... i potom se stablo vraća nazad na stek:

Binarna stabla i algebarski izrazi 49
Slika 49. - Postupak za pretvaranje postfiksnog izraza u stablo izraza - Krajnji rezultat.

Stablo izraza (koje predstavlja "rešenje zadatka"), nalazi se na vrhu steka, a kao što smo naveli još na početku, preko formiranog stabla izraza moguće je rekonstruisati sva tri oblika notacije (sprovođenjem DFS obilazaka), i moguće je naravno izračunati vrednost izraza.

U nastavku, detaljno ćemo prikazati navedene postupke.

Kreiranje prefiksnog zapisa preko stabla izraza

Prefiksni zapis izraza nastaje preorder obilaskom stabla, pri čemu za svaki čvor važi sledeći redosled ispisa:

  • koreni čvor
  • levo podstablo
  • desno podstablo

U primerima ćemo koristiti stablo koje je nastalo preko jednog od dva prethodno prikazana postupka za kreiranje stabla izraza:

Binarna stabla i algebarski izrazi 50
Slika 50. - Kreiranje prefiksne notacije preko stabla izraza - početna situacija.

Usput: u nastavku ćemo smatrati da su čitaoci detaljno upoznati sa različitim varijantama DFS obilazaka, o kojima smo već pisali.

Obilazak počinje od korenog čvora koji (shodno pravilima) može biti ispisan odmah:

Binarna stabla i algebarski izrazi 65
Slika 51. - Kreiranje prefiksne notacije preko stabla izraza - Korak 1.

Operator + takođe se može odmah ispisati, budući da je u pitanju koreni čvor podstabla:

Binarna stabla i algebarski izrazi
Slika 52. - Kreiranje prefiksne notacije preko stabla izraza - Korak 2.

Operand a (koji je list), takođe se može ispisati odmah: *

Binarna stabla i algebarski izrazi 67
Slika 53. - Kreiranje prefiksne notacije preko stabla izraza - Korak 3.

* U implementaciji (koja je sprovedena korektno), operandi se jasno razlikuju od operatora (čime se sprečavaju pokušaji daljeg grananja u situacijama kada algoritam naiđe na operand).

Operator sabiranja (na koji se algoritam vraća), već je obiđen i ispisan, što znači da neće biti ponovo ispisan, ali, prelazi se na desno podstablo:

Binarna stabla i algebarski izrazi 68
Slika 54. - Kreiranje prefiksne notacije preko stabla izraza - Korak 4.

Operator množenja (kao koren podstabla), ispisuje se odmah:

Binarna stabla i algebarski izrazi 69
Slika 55. - Kreiranje prefiksne notacije preko stabla izraza - Korak 5.

Operand b (kao list), takođe se ispisuje odmah * (i sledi povratak na čvor *).

Binarna stabla i algebarski izrazi 70
Slika 56. - Kreiranje prefiksne notacije preko stabla izraza - Korak 6.

* Da se podsetimo još jednom: operand ne može biti koren podstabla.

Po povratku na operator množenja, može se samo konstatovati da je čvor već obiđen (tj. ispisan) ....

Binarna stabla i algebarski izrazi 71
Slika 57. - Kreiranje prefiksne notacije preko stabla izraza - Korak 7.

.... i stoga sledi prelazak na desno podstablo.

Operand c (takođe list), takođe se može ispisati odmah:

Binarna stabla i algebarski izrazi 72
Slika 58. - Kreiranje prefiksne notacije preko stabla izraza - Korak 8.

Sledi "još jedan" povratak na operator množenja - koji se ne ispisuje (budući da je već obiđen i ispisan) ....

Binarna stabla i algebarski izrazi 73
Slika 59. - Kreiranje prefiksne notacije preko stabla izraza - Korak 9.

.... operator sabiranja je takođe već obiđen i ispisan ....

Binarna stabla i algebarski izrazi 74
Slika 60. - Kreiranje prefiksne notacije preko stabla izraza - Korak 10.

.... a isto važi i za koreni čvor, koji je još na početku rešen (pa preostaje samo da se obradi desno podstablo).

Binarna stabla i algebarski izrazi 75
Slika 61. - Kreiranje prefiksne notacije preko stabla izraza - Korak 11.

Čvor d se može ispisati odmah ....

Binarna stabla i algebarski izrazi 76
Slika 62. - Kreiranje prefiksne notacije preko stabla izraza - Korak 12.

.... a budući da nema daljeg grananja, * sledi povratak na koreni čvor, ali, pošto je koreni čvor rešen (odavno :)) - i pri tom nema čvorova koji se dalje mogu obilaziti - prefiksni izraz je formiran:

Binarna stabla i algebarski izrazi 77
Slika 63. - Kreiranje prefiksne notacije preko stabla izraza - Krajnji rezultat.

* Na slici "vidimo" da je u pitanju list, a u implementaciji bi operandi/listovi bili označeni na poseban način.

Kreiranje infiksnog zapisa preko stabla izraza

Infiksni zapis izraza nastaje inorder obilaskom stabla, ali (sasvim očekivano), nije u pitanju isti ispis kao u slučaju tipičnog/standardnog inorder obilaska (sa kakvim smo se sreli u 3. nastavku mini-serijala o AVL implementaciji).

Da bismo dobili korektan rezultat (pri formiranju bilo kog 'podizraza' koji odgovara nekom podstablu), pažnju treba obratiti na prioritet tri čvora: operatora koji stoji u korenu podstabla, i dva direktna potomka.

Uskoro sledi detaljnije objašnjenje (na primeru stabla koje već koristimo), ali, prvo ćemo se pozabaviti 'osnovnijim tehnikalijama'.

Takođe, pred kraj poglavlja o kreiranju postfiksnog zapisa, prikazaćemo i alternativni algoritam za kreiranje infiksnog zapisa.

Za početak, osnovna postavka je (zapravo) slična tipičnom/uobičajenom inorder obilasku:

Binarna stabla i algebarski izrazi 78
Slika 64. - Kreiranje infiksne notacije preko stabla izraza - Početna situacija.

Prvo se rešava i ispisuje levo podstablo (u konkretnom primeru: (a+b*c)), zatim se ispisuje znak operacije (/), nakon čega se ispisuje i sadržaj desnog podstabla (tj. čvor d).

Naravno, jedno od najvažnijih pitanja (na neki način - najvažnije pitanje (kako u ovom primeru tako i inače)), tiče se postavljanja zagrada.

Prethodno smo naveli sadržaj levog podstabla u zagradi ('kako i treba'), što je bila dobra ilustracija, ali (pošto stabla nećemo rešavati "mi", već računar), moramo iznaći algoritam koji je u stanju da donosi pravilne i blagovremene odluke o uokviravanju delova izraza zagradama.

Pre nego što pređemo na opis algoritma, primetićemo sledeće:

  • ne računajući zagrade, redosled tokena (u ispisu), odgovara tipičnom/standardnom inorder ispisu binarnog stabla
  • pri uokviravanju delova izraza zagradama, u obzir treba uzeti prioritete: levog podstabla, znaka operacije i desnog podstabla
  • prioritet bilo kog podstabla (tj. kasnije, bilo kog pravilno definisanog infiksnog podizraza), određen je prioritetom operacije koja stoji u korenu podstabla

Prisustvo ili odsustvo zagrada (u ispisu), određuje se na pomalo idiosinkratičan način - u trenutku kada se u obilasku nailazi na koren podstabla:

  • leva strana izraza uokviruje se naknadno
  • desna strana izraza uokviruje se unapred

Što se tiče prioriteta izraza, uvešćemo sledeća pravila:

  • samostalni operandi imaju prioritet 0
  • stabla izraza u čijem su korenu operacije sabiranja ili oduzimanja, imaju prioritet 1
  • stabla izraza u čijem su korenu operacije množenja ili deljenja, imaju prioritet 2

U slučaju stabla koje koristimo kao primer, prvo se rešava levo podstablo:

Binarna stabla i algebarski izrazi 79
Slika 65. - Kreiranje infiksne notacije preko stabla izraza - Korak 1.

Operand a (tj. samostalni operand), neće biti uokviren zagradama, ali, pitanje je da li treba uokviriti izraz b*c?

Algoritam je sledeći: u svakom podstablu, leva ili desna strana izraza uokviruje se zagradama ukoliko je prioritet operacije u vrhu levog ili desnog podstabla - veći od nule - i pri tom manji od prioriteta operacije koja je zapisana u korenom čvoru.

Pošto operator * (iz desnog podstabla b*c) ima veći prioritet od operatora + koji stoji u korenu podstabla a+b*c, sledi da podizraz b*c neće biti uokviren zagradama.

Prisustvo ili odsustvo zagrada u desnom podstablu (tj. desnom delu izraza), rešeno je 'unapred', ali, u 'obrnutoj situaciji' - rezultat bi bio drugačiji: ako bi na drugom nivou stajao znak * a na trećem nivou znak + - izraz sa trećeg nivoa morao bi biti uokviren zagradama (da ne bi bio promenjen smisao podizraza a*(b+c)).

U svakom slučaju, levom podstablu početnog stabla odgovara zapis a + 'sadržaj desnog podstabla' (bez uokviravanja zagradama):

Binarna stabla i algebarski izrazi 80
Slika 66. - Kreiranje infiksne notacije preko stabla izraza - Korak 2.

Pošto smo 'poslednje podstablo' rešili još davno ('u mislima'), preostaje da primetimo (ovoga puta 'zvanično'), da je u pitanju zapis b*c (naravno, bez zagrada): *

Binarna stabla i algebarski izrazi 81
Slika 67. - Kreiranje infiksne notacije preko stabla izraza - Korak 3. - Obilazak desnog podstabla čvora "+" daje rezultat: "b*c" (bez uokviravanja zagradama).

* Nema zagrada - budući da su podstabla obični operandi sa prioritetom 0.

Levom podstablu početnog izraza odgovara infiksni izraz a+b*c (koji je 'i dalje' * bez zagrada):

Binarna stabla i algebarski izrazi 82
Slika 68. - Kreiranje infiksne notacije preko stabla izraza - Korak 4. - Obilazak celokupnog levog podstabla daje rezultat: "a+b*c" (takođe bez uokviravanja zagradama).

* Uskoro će se situacija promeniti, ali, "za sada", izraz je bez zagrada. :)

Kada se vratimo na rešavanje glavnog stabla, susrećemo se situacijom u kojoj se leva strana izraza uokviruje zagradama - 'naknadno'. *

Binarna stabla i algebarski izrazi 83
Slika 69. - Kreiranje infiksne notacije preko stabla izraza - Korak 5. - Na redu je ispis znaka operacije i - u praktičnom smislu (s obzirom na to da će levo podstablo biti rešeno brzo i lako) - formiranje konačnog izraza.

* 'Naknadno - ali - blagovremeno' (u trenutku kada na red dolazi operator na vrhu podstabla izraza).

Početnom stablu odgovaraju sledeći delovi:

  • leva strana, sa izrazom a + b * c (čiji je prioritet 1)
  • znak operacije / (čiji je prioritet 2)
  • desna strana, sa izrazom d (čiji je prioritet 0)

Pošto je prioritet leve strane (u slučaju početnog izraza), praktično određen pojavom operatora sabiranja (+), i budući da operator koji spaja levu i desnu stranu izraza (/), ima veći prioritet - prvo je potrebno levu stranu izraza uokviriti zagradama ....

Binarna stabla i algebarski izrazi 84
Slika 70. - Kreiranje infiksne notacije preko stabla izraza - Korak 6. - Budući da operator deljenja ima veći prioritet od operatora najnižeg prioriteta u izrazu "a+b*c", potrebno je izraz "a+b*c" staviti u zagradu.

.... nakon čega se može formirati infiksni izraz (a + b * c) / d - koji odgovara početnom stablu:

Binarna stabla i algebarski izrazi 85
Slika 71. - Kreiranje infiksne notacije preko stabla izraza - Krajnji rezultat je infiksni izraz: "(a+b*c)/d").

Kreiranje postfiksnog zapisa preko stabla izraza

Postfiksni zapis izraza nastaje postorder obilaskom stabla, pri čemu za svaki čvor važi sledeći redosled ispisivanja:

  • levo podstablo
  • desno podstablo
  • koreni čvor

Ponovo koristimo isto stablo, pretraga ponovo počinje od korenog čvora, ali, koreni čvor se praktično preskače * u prvom koraku:

Binarna stabla i algebarski izrazi 51
Slika 72. - Kreiranje postfiksne notacije preko stabla izraza - Korak 1.

* Budući da nisu rešena oba podstabla, koreni čvor se preskače (a to će biti 'tema' i u drugim podstablima čija obrada tek predstoji).

Kao što smo nagovestili, operator sabiranja takođe neće biti ispisan u prvom koraku, jer još uvek nije ispisan ostatak stabla u čijem korenu stoji čvor +:

Binarna stabla i algebarski izrazi 52
Slika 73. - Kreiranje postfiksne notacije preko stabla izraza - Korak 2.

Operand a ispisuje se na licu mesta (operand ne može biti koren podstabla).

Binarna stabla i algebarski izrazi 53
Slika 74. - Kreiranje postfiksne notacije preko stabla izraza - Korak 3.

Algoritam se vraća na operator sabiranja, i ponovo se čvor + ne može ispisati, jer nije obiđeno desno podstablo ovog čvora:

Binarna stabla i algebarski izrazi 54
Slika 75. - Kreiranje postfiksne notacije preko stabla izraza - Korak 4.

Sledi prelazak na desno podstablo, u čijem korenu stoji operator množenja - koji se takođe ne može ispisati 'odmah' (ni u slučaju čvora * nije obiđen (tj. ispisan) ostatak stabla u čijem korenu čvor * stoji):

Binarna stabla i algebarski izrazi 55
Slika 76. - Kreiranje postfiksne notacije preko stabla izraza - Korak 5.

Po prelasku na koren levog podstabla (koje odgovara operaciji množenja), nailazi se na operand b - list koji se može odmah ispisati (a vidimo takođe, na slici, da posle operanda b nema daljeg grananja):

Binarna stabla i algebarski izrazi 56
Slika 77. - Kreiranje postfiksne notacije preko stabla izraza - Korak 6.

Po povratku na operator množenja (koji se i dalje ne može ispisati, jer nije obiđeno desno podstablo) ....

Binarna stabla i algebarski izrazi 57
Slika 78. - Kreiranje postfiksne notacije preko stabla izraza - Korak 7.

.... algoritam prelazi na koren desnog podstabla (operacije množenja), a operand c je list, koji se može ispisati odmah (i nema naravno daljeg grananja):

Binarna stabla i algebarski izrazi 58
Slika 79. - Kreiranje postfiksne notacije preko stabla izraza - Korak 8.

Sada se može ispisati i operator množenja (budući da su obiđena oba podstabla) ....

Binarna stabla i algebarski izrazi 59
Slika 80. - Kreiranje postfiksne notacije preko stabla izraza - Korak 9.

.... a isto važi i za operator sabiranja (obiđena su oba podstabla i čvor + se može ispisati):

Binarna stabla i algebarski izrazi 60
Slika 81. - Kreiranje postfiksne notacije preko stabla izraza - Korak 10.

Međutim, po povratku na koren početnog stabla, može se samo konstatovati da ('i dalje') nije vreme za ispis čvora /, jer nije obrađeno desno podstablo ....

Binarna stabla i algebarski izrazi 61
Slika 82. - Kreiranje postfiksne notacije preko stabla izraza - Korak 11.

.... ali, u ovom slučaju podstablo će biti rešeno vrlo brzo - operand d je list i može se ispisati već u sledećem koraku ....

Binarna stabla i algebarski izrazi 62
Slika 83. - Kreiranje postfiksne notacije preko stabla izraza - Korak 12.

... i sada - pošto su obiđena oba podstabla korenog čvora - može se ispisati i sam operator / (koji stoji u korenu stabla):

Binarna stabla i algebarski izrazi 63
Slika 84. - Kreiranje postfiksne notacije preko stabla izraza - Korak 13.

Budući da je celo stablo obiđeno, zadatak je rešen:

Binarna stabla i algebarski izrazi 64
Slika 85. - Kreiranje postfiksne notacije preko stabla izraza - Krajnji rezultat (stablo je obiđeno i kreiran je postfiksni izraz).

Alternativni algoritam za kreiranje infiksnog zapisa

Alternativni algoritam za kreiranje infiksnog zapisa predstavlja svojevrsnu kombinaciju inorder i postorder algoritama: prvo se obavlja postorder obilazak, ali, ispis odgovara inorder obilasku (naravno, i ovoga puta, uz dodavanje zagrada na odgovarajućim mestima).

Procedura koja se odnosi na određeno podstablo (u čijem je korenu token koji predstavlja operaciju), sastoji se iz sledećih pojedinačnih koraka:

  • rekurzivni obilazak levog podstabla uz pamćenje infiksnog zapisa i prioriteta izraza
  • rekurzivni obilazak desnog podstabla uz pamćenje infiksnog zapisa i prioriteta izraza
  • kreiranje infiksnog zapisa (koji odgovara datom podstablu)

Poslednji korak podrazumeva umetanje odgovarajućeg znaka operacije između rezultata za levo i desno podstablo, * uz potencijalno dodavanje zagrada ** izrazima koji su nastali rešavanjem levog i/ili desnog podstabla.

Još jednom, primetićemo da je u pitanju zanimljiva kombinacija algoritama inorder i postorder: u idejnom smislu obavlja se inorder obilazak, ali - u tehničkom smislu - postupak zapravo mnogo više podseća na postorder obilazak (naravno, nije u pitanju ni postorder obilazak u doslovnom smislu). :)

Redosled ispisivanja jeste "levo podstablo -> koreni čvor -> desno podstablo" (što je odlika inorder obilaska), ali, formiranje ispisa (za svaki čvor), obavlja se tek pošto su obiđena oba podstabla (što je odlika postorder obilaska).

* U pitanju je znak operacije koja 'spaja' levo i desno podstablo.

** Naravno, zagrade se dodaju samo ukoliko postoji potreba za dodavanjem zagrada.

U konkretnom primeru koji razmatramo ....

Binarna stabla i algebarski izrazi 78
Slika 86. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Početna situacija.

.... prvo se rešava levo podstablo (crveni deo), zatim desno podstablo (plavi deo), a nakon što se završe obe operacije, rešeni delovi se spajaju preko znaka operacije (zeleni čvor).

Procedura za levo podstablo (u ponešto pojednostavljenom obliku) ....

Binarna stabla i algebarski izrazi 79
Slika 87. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Korak 1.

.... podrazumeva umetanje znaka + između leve strane (čvor a) i desnog podstabla

Kažemo da je procedura pojednostavljena, budući da je u implementaciji potrebno proveravati tip čvorova u oba podstabla i sl, ali, "na slici" vidimo da je rezultat obilaska levog podstabla - ispis "a", dok je rezultat obilaska desnog podstabla - ispis "b * c".

Baš kao i u prvom algoritmu za kreiranje infiksnog ispisa, potrebno je upamtiti da leva strana ("a") ima prioritet 0, * i zatim se leva strana podstabla (tj. izraza), uparuje sa rezultatom rekurzivne obrade desnog podstabla:

Binarna stabla i algebarski izrazi 80
Slika 88. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Korak 2.

Po "skraćenom postupku", može se zaključiti da desnom podstablu odgovara izraz b * c, čiji je prioritet 2.

Binarna stabla i algebarski izrazi 81
Slika 89. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Korak 3. - Rekurzivni obilazak desnog podstabla čvora "+" daje rezultat: "b*c".

Po povratku na koren levog podstabla (budući da je vreme za formiranje infiksnog izraza), prvo treba sagledati sve elemente za ispis:

  • operand a (prioritet 0)
  • znak + (prioritet 1)
  • izraz b * c (prioritet 2)

Operator sabiranja (koji stoji u korenu podstabla), ima niži prioritet u odnosu na operator množenja (koji stoji u korenu podstabla izraza b * c), iz čega sledi da se celo levo podstablo početnog izraza može zapisati bez zagrada (tj. bez dodavanja zagrada podizrazu b * c):

Binarna stabla i algebarski izrazi 82
Slika 90. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Korak 4. - Rekurzivni obilazak celokupnog levog podstabla daje rezultat: "a+b*c".

Sada se može sagledati i početni izraz (smatraćemo da je "algoritamskim putem" obiđeno desno podstablo, pri čemu je ustanovljeno da desnom podstablu odgovara zapis "d" i prioritet 0).

Binarna stabla i algebarski izrazi 83
Slika 91. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Korak 5. - Pri povratku na koreni čvor, i dalje se ne može obaviti ispis, sve dok se ne obavi i rekurzivni obilazak desnog podstabla.

Kao i prvi put kada smo se bavili kreiranjem infiksnog zapisa, u formiranju finalnog zapisa učestvuju sledeći elementi:

  • leva strana, sa izrazom a + b * c (čiji je prioritet 1)
  • znak operacije / (čiji je prioritet 2)
  • desna strana, sa izrazom d (čiji je prioritet 0)

Shodno tome što operator + (koji stoji u korenu levog podstabla), ima niži prioritet od operatora * (koji stoji u korenu početnog stabla), potrebno je levu stranu početnog izraza uokviriti zagradama ....

Binarna stabla i algebarski izrazi 84
Slika 92. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Korak 6. - Rekurzivni obilazak desnog podstabla daje rezultat "d", a operator kojim se spajaju izrazi "a+b*c" i "d" je operator deljenja ("/"). Budući da operator deljenja ima viši prioritet od operatora najnižeg prioriteta u izrazu "a+b*c", potrebno je izraz "a+b*c" staviti u zagradu.

.... nakon čega se može formirati infiksni izraz (a + b * c) / d - koji odgovara stablu:

Binarna stabla i algebarski izrazi 85
Slika 93. - Kreiranje infiksne notacije preko stabla izraza - verzija 2 - Krajnji rezultat (posle svojevrsne kombinacije inorder i postorder obilazaka stabla, uz vrlo specifičan rekurzivni ispisa podstabala, sa pamćenjem međurezultata - dobija se rezultat: "(a+b*c)/d").

Računanje vrednosti izraza preko stabla

Pri računanju vrednosti izraza, potrebno je pre svega da identifikatori (promenljivih) budu zamenjeni brojčanim vrednostima.

U slučaju stabla koje smo do sada koristili kao primer, uvešćemo sledeće vrednosti:

  • a = 6
  • b = 3
  • c = 4
  • d = 2
Binarna stabla i algebarski izrazi 86
Slika 94. - Računanje vrednosti izraza preko stabla - Početna situacija (promenljive u stablu zamenjene su odgovarajućim brojčanim vrednostima).

Sama procedura računanja vrednosti podrazumeva postorder obilazak stabla, pri čemu se operacija zapisana u određenom čvoru primenjuje na levo i desno podstablo operatora - onda kada dati operator dođe na red za izvršavanje - posle čega na ("dotadašnjem") mestu operatora ostaje izračunata vrednost.

Ali (kao što smo još ranije nagovestili), u implementaciji, nije uputno da se čvor operatora doslovno menja čvorom koji predstavlja izračunatu vrednost, već je bolje da se u dizajnu klase koja predstavlja čvor stabla, predvidi polje za zapis rezultata.

(Uz opisane 'mere predostrožnosti, čuva se struktura stabla.)

Pogledajmo kako algoritam za računanje vrednosti funkcioniše na primeru stabla koje smo do sada koristili ....

U postorder obilasku stabla, biće za početak preskočeni operatori deljenja i sabiranja (jer podstabla navedenih operatora nisu rešena), a poslednji operator na koji se nailazi preko "prve grane DFS obilaska" - operator množenja - praktično je prvi operator koji se uzima u obzir za računanje.

Nakon obavljanja operacije 3 * 4 koja odgovara čvoru * ....

Binarna stabla i algebarski izrazi 87
Slika 95. - Računanje vrednosti izraza preko stabla - Korak 1. - Pri postorder obilasku "unutrašnjeg stabla operatora", prva operacija koja se sme izvršavati - ujedno je poslednja operacija na koju algoritam nailazi (u pitanju je množenje: 3 * 4).

.... podstablo 3 * 4 se svodi na izračunatu vrednost 12:

Binarna stabla i algebarski izrazi 88
Slika 96. - Računanje vrednosti izraza preko stabla - Korak 2. - Operator množenja zamenjen je brojem 12 (rezultat operacije 3 * 4)

Sledeći po redu čvor sa operatorom (operator sabiranja) ....

Binarna stabla i algebarski izrazi 89
Slika 97. - Računanje vrednosti izraza preko stabla - Korak 3. - Po pravilima za postorder obilazak stabla, na redu je operator sabiranja, koji podrazumeva operaciju 6 + 12.

.... svodi se na rezultat 18, koji odgovara izvršavanju operacije 6 + 12:

Binarna stabla i algebarski izrazi 90
Slika 98. - Računanje vrednosti izraza preko stabla - Korak 4. - Operator sabiranja zamenjen je vrednošću 18 (rezultat operacije 6 + 12)

Na kraju, jedini preostali čvor koji predstavlja operaciju (tj. čvor koji stoji u podstablu izraza 18 / 2) ....

Binarna stabla i algebarski izrazi 91
Slika 99. - Računanje vrednosti izraza preko stabla - Korak 5. - Na kraju, pri povratku na koreni čvor, algoritam nailazi na operator deljenja, koji podrazumeva operaciju 18 / 2.

.... takođe se svodi na izračunatu vrednost, u ovom slučaju: 9.

Vrednost koja je (na kraju) zapisana u korenom čvoru, predstavlja rezultat računanja vrednosti (početnog) izraza. *

Binarna stabla i algebarski izrazi 92
Slika 100. - Računanje vrednosti izraza preko stabla - Krajnji rezultat - Operator deljenja zamenjen je vrednošću 9 (rezultat operacije 18 / 2), a budući da je postorder obilazak stabla završen - vrednost korenog čvora predstavlja vrednost izraza (koji je prvobitno zapisan preko stabla izraza).

* Ali, spomenimo još jednom da je u implementaciji (tj. pri projektovanju klase koja predstavlja čvorove), bolje ukoliko se predvidi polje koje će sadržati vrednost izraza koji odgovara čvoru, jer (u najvećem broju situacija), doslovno "urušavanje" stabla u jedan čvor - ne predstavlja elegantno rešenje.

Generator stabla izraza

Pred kraj, pružamo vam priliku da isprobate 'tehnikalije' o kojima smo pisali u članku: unesite infiksni izraz i pustite da program generiše stablo izraza i sva tri oblika notacije.

Dozvoljeni znakovi:

  • pojedinačna mala i velika slova engleskog alfabeta
  • znaci računskih operacija: +, -, *, /
  • zagrade

Stablo izraza:

Za kraj ....

Posle svega što smo prikazali, može se reći da hrabrim pojedincima koji su stigli do kraja ovog članka (pri čemu nisu preskakali nijedan deo i zapravo žele da dodatno istražuju tematiku), preostaje samo još jedan zadatak - samostalna implementacija stabla izraza.

Nije baš u pitanju "lagan" ili "jednostavan" zadatak, ali, celokupno iskustvo je (zapravo) prilično zabavno - a usput ćete mnogo toga i naučiti.

Samo hrabro! :)

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 > Binarna stabla i algebarski izrazi (stablo izraza)
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