You are on page 1of 42

Algoritmi i Strukture Podataka

Stekovi
Zadatak 1 – primena steka u evaluaciji izraza
Izračunati vrednost izraza datog u postfiksnoj formi:
AB+CD-EAE*+
ako promenljive imaju vrednosti:
A=-6, B=4, C=5, D=3, E=2.

Rešenje:
- Na osnovu osobina postfiksnog izraza da operandi
neposredno prethode operatoru i osobine da se poredak
operanada ne menja, za razliku od poretka operatora,
generiše se algoritam za izračunavanje izraza datog u
postfiksnoj notaciji.
- Algoritam prirodno koristi stek za smeštanje operanada.
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 2
Beograd
Zadatak 1 - rešenje
EVAL-EXP(postfix) rez = POP(S)
INIT_STACK(S, n) if (STACK-EMPTY(S)) then
while (not_end_of postfix) do return rez
x = INPUT(postfix) else
if (x = operand) then ERROR(Nepravilan izraz)
PUSH(S, x) end_if
else if (x = un_op) then
oprnd = POP(S)
rez = x oprnd
PUSH(S, rez)
else if (x = bin_op) then
oprnd2 = POP(S)
oprnd1 = POP(S)
rez = oprnd1 x oprnd2
PUSH(S, rez)
end_if
end_while

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 3


Beograd
Zadatak 1 - rešenje
input x op1 op2 rez S
A -6 -6
B 4 -6 4
+ + -6 4 -2 -2
C 5 -2 5
D 3 -2 5 3
- - 5 3 2 -2 2
E 2 -2 2 2
  2 2 4 -2 4
  -2 4 16 16
A -6 16 -6
E 2 16 -6 2
* * -6 2 -12 16 -12
+ + 16 -12 4 4
Stek je ostao prazan, dakle, izraz je bio pravilan.
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 4
Beograd
Zadatak 2 – primena steka u obradi
aritmetičkih izraza

Izvršiti konverziju izraza u infiksnog notaciji


A+B*C-(D+E-FGH)*(I+(J-K)*L)/M
u izraz u postfiksnoj notaciji.

Izrazi u infiksnoj notaciji su nepogodni za prevodioce (generatore koda),


jer zahtevaju višestruke prolaze kroz izraz
Izrazi u prefiksnoj i postfiksnoj notaciji zahtevaju samo jedan prolaz
Češće se koristi postfiksna notacija jer se jednostavno realizuje stekom
Primer:
A+B*C+E/D  ABC*+ED/+

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 5


Beograd
Zadatak 2 - rešenje
IN2POST(infix, postfix) while not STACK-EMPTY(S) and
INIT-STACK(S,n) (IPR(next) ≤ SPR(TOP(S))) do
rank = 0 x = POP(S)
next = INPUT(infix) OUTPUT(x, postfix)
while (next <> EOF) do rank = rank + R(x)
if (next = operand) then if (rank < 1) then ERROR(Nepravilan izraz)
OUTPUT(next, postfix) end_if
rank = rank + 1 end_while
else if (STACK-EMPTY(S) or next ≠ ’)’ ) then
PUSH(S, next)
else x = POP(S)
operator ul.pr stek pr. R end_if
+,- 2 2 -1 next = INPUT(infix)
end_while
*,/ 3 3 -1
while not (STACK-EMPTY(S)) do
 5 4 -1 x = POP(S)
OUTPUT(x, postfix)
( 6 0 -
rank = rank + R(x)
) 1 - - end_while
if (rank ≠ 1) then
Elektrotehnički fakultet, 6
Beograd ERROR(Nepravilan izraz)
end_if
Zadatak 2 - rešenje
A+B*C-(D+E-FGH)*(I+(J-K)*L)/M

next stek postfix rank • next : sledeći podatak ulaznog


niza
A A 1
• stek : sadržaj steka
+ + A 1
• postfix : izlazni izraz
B + AB 2 • rank : brojač koji proverava
* +* AB 2 korektnost izraza
C +* ABC 3
- - ABC*+ 1 operator ul.pr stek pr. R
( -( ABC*+ 1 +,- 2 2 -1
D -( ABC*+D 2 *,/ 3 3 -1
+ -(+ ABC*+D 2  5 4 -1
E -(+ ABC*+DE 3 ( 6 0 -
- -(- ABC*+DE+ 2 ) 1 - -
... ... ... ...
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 7
Beograd
Zadatak 2 - rešenje
next stek postfix rank next stek postfix rank
... ... ... ... ... ... ... ...
- -(- ABC*+DE+ 2 J -*(+( ABC*+DE+FGH-IJ 4
F -(- ABC*+DE+F 3 - -*(+(- ABC*+DE+FGH-IJ 4
 -(- ABC*+DE+F 3 K -*(+(- ABC*+DE+FGH-IJK 5
G -(- ABC*+DE+FG 4 ) -*(+ ABC*+DE+FGH-IJK- 4
 -(- ABC*+DE+FG 4 * -*(+* ABC*+DE+FGH-IJK- 4
H -(- ABC*+DE+FGH 5 L -*(+* ABC*+DE+FGH-IJK-L 5
) - ABC*+DE+FGH- 2 ) -* ABC*+DE+FGH-IJK-L*+ 3
* -* ABC*+DE+FGH- 2 / -/ ABC*+DE+FGH-IJK-L*+* 2
( -*( ABC*+DE+FGH- 2 M -/ ABC*+DE+FGH-IJK-L*+*M 3
I -*( ABC*+DE+FGH-I 3 ABC*+DE+FGH-IJK-L*+*M/- 1
+ -*(+ ABC*+DE+FGH-I 3
( -*(+( ABC*+DE+FGH-I 3
... ... ... ...

Rezultat: ABC*+DE+FGH-IJK-L*+*M/-
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 8
Beograd
Zadatak za vežbu
Izvršiti konverziju izraza u infiksnog notaciji
(A+B)(C-D)E+A*E
u izraz u postfiksnoj notaciji.
next stek postfix rank next stek postfix rank
( ( 0 ... ... ... ...
A ( A 1 + + AB+CD-E 1
+ (+ A 1 A + AB+CD-EA 2
B (+ AB 2 * +* AB+CD-EA 2
) AB+ 1 E +* AB+CD-EAE 3
  AB+ 1 AB+CD-EAE*+ 1
( ( AB+ 1
C ( AB+C 2
- (- AB+C 2
D (- AB+CD 3 Rezultat: AB+CD-EAE*+
)  AB+CD- 2
  AB+CD- 2
E  AB+CD-E 3
... ... ... ... 9
Zadatak 3
Osmisliti način na koji se stek može proširiti dodatnim
informacijama, tako da se efikasno podrži dohvatanje
minimalne i maksimalne vrednosti na steku. Napisati
pseudokodove za osnovne operacije sa stekom, uz metode
za dohvatanje minimalnog, odnosno maksimalnog elementa,
pod uslovom da se koristi sekvencijalna reprezentacija.
Pokazivač vrha steka pokazuje na poslednju zauzetu
lokaciju na steku.

Rešenje:
– Prolazak kroz sve elemente steka nije efikasno rešenje
– Neefikasno ažuriranje u slučaju čuvanja pokazivača na minimalni i
maksimalni element na steku (prilikom skidanja elemenata sa
steka)
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 10
Beograd
Zadatak 3 - rešenje
• Ideja je da se uz svaki element čuvaju trenutne
minimalne i maksimalne vrednosti na steku – O(1) za
pristup

val min max

5 5 5

3 3 5

4 3 5

8 3 8

1 1 8

10 1 10

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 11


Beograd
Zadatak 3 - rešenje
PUSH(S,x)
if (top[S] = n) then
ERROR(Overflow)
else
if (STACK_EMPTY(S) or x < min(S[top[S]])) then
min = x
else min = min(S[top[S]]))
end_if
if (STACK_EMPTY(S) or x > max(S[top[S]])) then
max = x
else max = max(S[top[S]]))
end_if
top[S] = top[S] +1
val(S[top[S]]) = x
min(S[top[S]]) = min
max(S[top[S]]) = max
end_if
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 12
Beograd
Zadatak 3 - rešenje
POP(S) MAX(S)
if (top[S] = 0) then if (top[S] = 0) then
ERROR(Underflow) ERROR(Underflow)
else else
x = val(S[top[S]]) MIN(S) max = max(S[top[S]])
top[S] = top[S] -1 if (top[S] = 0) then return max
return x ERROR(Underflow) end_if
end_if else
min = min(S[top[S]])
return min
end_if

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 13


Beograd
Zadatak 4
Razmatra se sekvencijalna implementacija više stekova.
Napisati funkcije brisanja elementa sa steka Si i umetanje
vrednosti x na stek Si.

• Nepraktično je koristiti više nezavisnih stekova


– za svaki od njih mora da se unapred odredi i rezerviše
maksimalan kapacitet
– izvestan broj njih može biti uglavnom nepopunjen
(rasipanje memorijskog prostora)
• Rešenje: smestiti više stekova u jedan vektor

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 14


Beograd
Zadatak 4 - rešenje

Najjednostavniji slučaj: dva steka u jednom vektoru

stek 1 slobodan stek 2


prostor

Ova ideja ne može da se primeni na slučaj sa više stekova

slobodan slobodan slobodan


stek 1 stek 2 stek 3
prostor prostor prostor

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 15


Beograd
Zadatak 4 - rešenje
Neka je u zajedničkom vektoru V[1:m] smešteno k stekova S1, ..., Sk.
Osim vektora V, potrebni su vektori:
• vektor pokazivača na vrhove stekova top[1:k]
• vektor pozicije dna stekova b[1:k]

top[i] pokazuje na vrh, a b[i] na dno steka Si, 1  i  k.


POP-M(i)
PUSH-M(i, x)
if (top[i] = b[i])
if (top[i] = b[i + 1])
then
then
return
underflow
ERROR(Overflow)
else
else
x = V[top[i]]
top[i] = top[i] + 1
top[i] = top[i] –
V[top[i]] = x
1
end_if
return x
end_if
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 16
Beograd
Redovi
Zadatak 1
Na ulasku u železničku stanicu sa jednom prugom i jednim
slepim kolosekom desio se kvar, pa se na ulazu napravila
kolona međunarodnih i domaćih vozova. Kvar je otklonjen i
treba puštati vozove. Da bi međunarodni vozovi manje kasnili,
oni se puštaju prvi, po redosledu dolaska. Postoji samo jedna
pruga i vozovi se ne mogu „preticati“, tako da svi domaći vozovi
koji su bili ispred međunarodnih se prebacuju na slepi kolosek
koji je dovoljno veliki da svi vozovi mogu da stanu. Kada svi
međunarodni vozovi odu, puštaju se prvo vozovi sa slepog
koloseka, pa onda preostali domaći vozovi iz kolone. Domaćim
vozovima je dozvoljeno menjati poredak propuštanja. U samu
stanicu može da stane samo jedan voz.
Koje strukture podataka bi trebalo koristiti za modeliranje
vozova u koloni i na slepom koloseku, kako i zašto, u cilju
efikasnog rešavanja ovog problema?
18
Zadatak 1 - rešenje

• Međunarodni vozovi se preusmeravaju tako da se njihov


međusobni poredak ne sme promeniti.
– Implementacija korišćenjem strukture reda.
• Domaći vozovi se preusmeravaju na slepi kolosek. Njihov
redosled se sme promeniti.
- Kako slepi kolosek ima samo jedan izlaz, pogodna struktura za
njegovu realizaciju je stek.
• Jedan po jedan, na početku se puštaju vozovi iz reda, dok u
njemu ima međunarodnih vozova
• Potom se prazni struktura steka i na kraju ostatak reda
• Da bi se ovo realizovalo, potrebno je pratiti i broj
međunarodnih vozova u redu

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 19


Beograd
Zadatak 1 - primer
Na ulasku u stanicu se nalaze sledeći vozovi:
[stanica] <- M12, D07, D02, M03, D03

SLEPI
KOLOSEK

M12 D07 D02 M03 D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 20


Beograd
Zadatak 1 - primer
- prvi međunarodni voz M12 prelazi u stanicu

SLEPI
KOLOSEK

M12 D07 D02 M03 D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 21


Beograd
Zadatak 1 - primer
- međunarodni voz M12 izlazi iz stanice, a domaći voz D07 prelazi na
slepi kolosek, da bi međunarodni voz M03 mogao da prođe u stanicu
(međunarodni imaju prioritet)

SLEPI
KOLOSEK

D07

D02 M03 D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 22


Beograd
Zadatak 1 - primer
- iz istog razloga i domaći voz D02 prelazi na slepi kolosek

SLEPI
KOLOSEK

D07 D02

M03 D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 23


Beograd
Zadatak 1 - primer
- međunarodni voz M03 sada može da pređe u stanicu

SLEPI
KOLOSEK

D07 D02

M03 D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 24


Beograd
Zadatak 1 - primer
- pošto nema više međunarodnih vozova, domaći vozovi mogu sa
slepog koloseka da prelaze u stanicu, dakle, D02 ide u stanicu

SLEPI
KOLOSEK

D07

D02 D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 25


Beograd
Zadatak 1 - primer
- nakon njegovog odlaska i D07 sa slepog koloseka prelazi
u stanicu

SLEPI
KOLOSEK

D07 D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 26


Beograd
Zadatak 1 - primer
- D07 odlazi sa stanice, pa domaći voz D03 iz kolone može
da pređe u stanicu

SLEPI
KOLOSEK

D03

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 27


Beograd
Zadatak 1 - primer
- na kraju, voz D03 odlazi i stanica ostaje prazna

SLEPI
KOLOSEK

STANICA

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 28


Beograd
Zadatak 2
Razmatra se prioritetni red. Objasniti moguće načine realizacije
operacije brisanja (elementa najmanjeg prioriteta), ako je red
implementiran kao vektor.

• Postoji više načina realizacije prioritetnih redova


implementiranih kao vektor:
– markiranje izbačenog elementa
– umetanje novog elementa preko markiranog
– pomeranje svih elemenata prilikom brisanja
– održavanje uređenosti elemenata
• Realizacije u pomoću vektora su uglavnom neefikasne!
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 29
Beograd
Zadatak 2 - rešenje
1. Brisanje se najbrže obavlja ako se samo mesto uklonjenog
elementa posebno markira kao nevažeći element.

9 4 2 5 1 6 3

Pri narednim pretraživanjima na najmanji element ignorišu se markirani


! Iako se markirani elementi ignorišu, prilikom brisanja im se mora
pristupiti (da bi se utvrdilo da su markirani)

! Lako može da se prepuni niz koji sadrži mnogo markiranih elemenata


Tada mora da se prepakuje niz (izbace markirani elementi)

Dodavanje elementa vrednosti 8 Dodavanje elementa vrednosti 7

9 4 2 5 1 6 3 8 9 4 5 6 3 8 7

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 30


Beograd
Zadatak 2 - rešenje
2. S obzirom da su markirane pozicije praktično slobodne, prethodni
način može da se modifikuje tako što se, umesto iza poslednjeg,
dozvoljava umetanje na poziciju prvog nevažećeg elementa
(ako takav postoji).

9 4 2 5 1 6 3

free rear

! Neefikasno umetanje: mora da se pretraži ceo vektor


Može da se uvede pokazivač free koji pokazuje na prvu slobodnu lokaciju.
Umetanje se onda vrši na mestu gde pokazuje free.

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 31


Beograd
Zadatak 2 - rešenje
3. Ako red nije sortiran, neefikasno je dohvatanje elementa: mora da
se prođe kroz ceo vektor i pronađe odgovarajući element.
Radi efikasnog dohvatanja – poželjno je držati red sortiran

! Neefikasno umetanje: ako se ne umeće na kraj, moraju da se pomeraju


elementi

! U proseku se pomera ½ elemenata.


Moguće rešenje: ostaviti slobodnog prostora pre početka reda.
– Pomerati elementa pri početku reda ako ima manje elemenata od
mesta umetanja do početka reda
– Pomerati elemente pri kraju reda u suprotnom

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 32


Beograd
Zadatak 3
Posmatra se struktura podataka nad kojom je moguće izvršiti
sledeće operacije za pojedinačne podatke:
‒ dodavanja (add)
‒ uklanjanja (remove)

Struktura podataka je predviđena za rad sa celim brojevima.


Poznato je da struktura podataka može biti stek, red ili
prioritetan red kod kojeg element manje vrednosti ima
veći prioritet.
Predložiti jednostavnu i efikasnu proceduru koja
jednoznačno određuje o kojoj vrsti strukture podataka se
radi.

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 33


Beograd
Zadatak 3 - rešenje
• Tražena procedura treba da omogući
jednoznačno određivanje vrste strukture podataka:
– stek vraća poslednji stavljen element
– red vraća prvi stavljen element
– prioritetni red vraća element najmanje vrednosti
• Prema tome:
– treba osmisliti postupak koji koristi raspoložive operacije
(dodavanje, uklanjanje) i nedvosmisleno nameće zaključak
o prirodi strukture podataka
– ima 3 različite strukture podataka → 3 različita moguća odgovora
• Dakle:
– umetnuti 3 elementa različitih vrednosti
– izvaditi jedan element
– na osnovu njegove vrednosti doneti zaključak
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 34
Beograd
Zadatak 3 - rešenje
• Pitanje: kojim redom umetati vrednosti?
– stek vraća poslednju umetnutu
– red vraća prvu umetnutu
– prioritetni red vraća najmanju
– → najmanja ne sme biti ni prva ni poslednja
– → redosled ostalih nije bitan

PROCEDURE IDENTIFY(data_structure)
data_structure.add(2)
data_structure.add(1)
data_structure.add(3)
x = data_structure.remove()
if x = 1 then return pri_queue
else if x = 2 then return queue
else return stack
35
end_procedure
Zadatak - za samostalnu vežbu
• U odeljenju za prijem i obradu pošiljki, u preduzeću
specijalizovanom za gradski transport pošiljki, rade tri zaposlena:
jedan prima pošiljke koje donose kuriri, drugi razvrstava pošiljke
prema ugovorenom vremenu isporuke (hitno, u toku dana,
u roku od 3 dana), a treći pakuje pošiljke u transportna vozila.
Pošiljke se u transportna vozila pakuju prema redosledu prispeća u
odeljenje, tako da prednost imaju pošiljke koje treba isporučiti pre
ostalih. Kapacitet transportnih vozila je 40 pošiljki
(smatrati da su sve pošiljke iste težine i zapremine).
1. Predložiti strukturu podataka koja omogućava efikasnu selekciju pošiljki
za slanje na prethodno opisan način. Skicirati procedure
za umetanje u predloženu strukturu i dohvatanje elemenata iz nje.
2. Skicirati procedure PRIJEM koja realizuje prijem i razvrstavanje pošiljke
i SLANJE koja realizuje selekciju i pakovanje pošiljke
u transportno vozilo.

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 36


Beograd
Zadatak 4
Sa redom implementiranim kao ulančana lista na koju
pokazuje pokazivač q, realizovati operaciju umetanja
elementa sa vrednošću x i operaciju brisanja iz
nepraznog reda.

• Kod neprioritetnih redova, umetanje se vrši:


– nov element se dodaje na kraj reda
– element se uzima sa početka reda
• Tzv. FIFO (first in – first out) ili
FCFS (first come – first served) disciplina

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 37


Beograd
Zadatak 4 - rešenje
INSERT-L(q, x) DELETE-L(q)
p = GETNODE if (q = nil) then
info(p) = x return underflow
next(p) = nil else
if (rear[q] = nil) then p=q
q=p x = info(p)
else q = next(p)
next(rear[q]) = p if (q = nil) then
end_if rear[q] = nil
rear[q] = p end_if

FREENODE(p)
return x
end_if

INSERT-L je zapravo dodavanje elementa na kraj liste,


a DELETE-L je brisanje elementa sa početka liste.
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 38
Beograd
Zadatak 5
Realizovati operaciju umetanja elementa u prioritetni red
implementiran kao uređena jednostruko ulančana lista.
Mogu se koristiti već realizovane funkcije:
ADD_L(S, x) – ubacivanje novog elementa na početak liste
INSERT_AFTER(q, x) – umetanje u listu novog čvora
sa sadržajem x iza čvora čija je adresa q.

• Prioritetni red – novi element ne sme da se umetne bilo gde


• Realizacija prioritetnog reda pomoću ulančane liste
je efikasnija u odnosu na vektor
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 39
Beograd
Zadatak 5 - rešenje
PQ-INSERT(pri_q, x)
q = nil
p = pri_q
while (p ≠ nil) and (x ≥ info(p)) do
q=p
p = next(p)
end_while
if (q = nil) then
ADD-L(pri_q, x)
else
INSERT-AFTER(q, x)
end_if

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 40


Beograd
Zadatak 6
Realizovati red koristeći dva steka implementirana
u jednom vektoru.
front rear

9 3 4 2 6 5 1

bottom top stek za umetanje (S1)

top bottom stek za dohvatanje (S2)

• Ideja:
– jedan stek služi za umetanje novog elementa
– drugi stek služi za dohvatanje elementa

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 41


Beograd
Zadatak 6 - rešenje

DELETE(x)
INIT(S1,S2)
if (top1 == top2) then
ALLOCATE(V[1:n])
return underflow
b2 = b1 = top1 = top2 = 0
end_if
rear = front = 0
x = POP(S2)
return
b1 = top2
front = top2
INSERT(x) return x
PUSH(S1, x)
b2 = top1
rear = top1
return

Za vežbu: Realizovati stek koristeći dva reda implementirana u jednom vektoru.

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 42


Beograd

You might also like