You are on page 1of 28

Fakultet elektrotehnike Univerziteta u Tuzli

1/28
Algoritmi i strukture podataka
Algoritmi i strukture podataka
dr.sc. Edin Pjani
Fakultet elektrotehnike Univerziteta u Tuzli
2/28

Stog (stack)

osnovne operacije i implementacija

Red (queue)

osnovne operacije i implementacija

cirkularni bafer
Pregled predavanja
Pregled predavanja
Fakultet elektrotehnike Univerziteta u Tuzli
3/28
Stog (stack) i red (queue)
Stog (stack) i red (queue)

Primjeri iz ivota za stog (stack)

Primjeri iz ivota za red (queue)


Fakultet elektrotehnike Univerziteta u Tuzli
4/28
Stog (stack) i red (queue) - (AP)
Stog (stack) i red (queue) - (AP)

!deja je ista kao i u stvarnom ivotu" kolekcija


elemenata u linearnom redu (linearna struktura
podataka)# odnosno lista$

stack" pristup samo sa jedne strane

queue" ulaz sa jedne a izlaz sa druge strane

moramo voditi ra%una o kapacitetu

4
8
5
1
2
2 1 5 8 4
ulaz
izlaz
ulaz izlaz
Stog (Stack):
L!" # Last n !irst "ut
$%d (Queue):
!!" & !irst n !irst "ut
Fakultet elektrotehnike Univerziteta u Tuzli
5/28
Stog (stack) i red (queue) - (AP)
Stog (stack) i red (queue) - (AP)

& osnovne operacije"

'ogu(e je definisati i ostale operacije (metode#


operatore)# prema potrebi$
Stog (stack) Red (queue)
void push(Elem x)
doda'anj%
void enqueue(Elem x)
void ubaci(Elem x)
Elem pop()
(itanj% i
u)lanjanj%
Elem dequeue()
Elem izbaci()
Elem top()
Elem gornji()
(itanj% *%z
u)lanjanja
Elem front()
Elem prednji()
bool isEmpty()
bool jePrazan()
+ro'j%ra da li j%
stru)tura +razna
bool isEmpty()
bool jePrazan()
,)o j% stru)tura +razna & +ro*l%-i +ri u)lanjanju ili (itanju %l%-%nta.
Fakultet elektrotehnike Univerziteta u Tuzli
./28
Stack ) implementacija pomo(u niza
Stack ) implementacija pomo(u niza

Stack pomo(u niza moemo realizovati kori*tenjem


jedne od dvije strategije (koja je bolja+)"

,$ vr- stacka je na kraju liste

dodajemo na kraj i uklanjamo sa kraja liste


.$ vr- stacka je na po%etku liste

dodajemo na po%etak i uklanjamo sa


po%etka liste
4 8 5 1 2
. . .
4
8
5
1
2
'
r
/
2 1 5 8 4
. . .
'
r
/
O(1) => dobro
O(n) => loe
Fakultet elektrotehnike Univerziteta u Tuzli
0/28
Stack ) implementacija pomo(u niza
Stack ) implementacija pomo(u niza
template <typename Elem>
class StackNiz
{
public:
StackNiz(int v); // v - inicijalna velicina
~StackNiz();
void push(Elem);
Elem pop();
Elem gonji();
bool je!azan;
private:
int velicina; // velicina alocianog niza u poza"ini
int vh; // in"eks vha stacka u nizu
Elem # elementi;
voi" ealociaj(int v); // v - nova velicina
}
Fakultet elektrotehnike Univerziteta u Tuzli
8/28
Stack ) realociranje
Stack ) realociranje
template <typename Elem>
void StackNiz<Elem>::ealociaj(int nova$vel)
{
Elem # novi$niz % new Elem&nova$vel';
for(int i%(; i<velicina; i)))
novi$niz&i' % elementi&i';
delete&' elementi;
elementi % novi$niz;
velicina % nova$vel;
}
O(n)
Fakultet elektrotehnike Univerziteta u Tuzli
1/28
Stack pus- ) dodavanje novog elementa
Stack pus- ) dodavanje novog elementa

/odajemo element 0"


'
r
/
2 1 5 8 4
. . .
4
8
5
1
2
0
4
8
5
1
2
0
0
'
r
/
2 1 5 8 4 0
. . .
Po-j%riti 'r/ za j%dno -j%sto na+rij%d i +osta'iti
'rij%dnost tog %l%-%nta niza na no'u 'rij%dnost (0).
"*ratiti +a2nju na stanj% )ad j% stac) +un3
Fakultet elektrotehnike Univerziteta u Tuzli
14/28
Stack pop ) uklanjanje elementa
Stack pop ) uklanjanje elementa

1klanjamo gornji element sa stacka"


'
r
/
2 1 5 8 4 0
. . .
4
8
5
1
2
0
4
8
5
1
2
0
'
r
/
2 1 5 8 4
. . .
5)loni-o 'rij%dnost na ind%)su na )oji +o)azuj%
'r/ i 'r/ s-anji-o za j%dan.
"*ratiti +a2nju na stanj% )ad j% stac) +razan3
Fakultet elektrotehnike Univerziteta u Tuzli
11/28
Stack ) ubacivanje i izbacivanje elemenata
Stack ) ubacivanje i izbacivanje elemenata

1bacivanje elementa u stack (push)

!zbacivanje elementa iz stacka (pop)"


template <typename Elem>
void StackNiz<Elem>::push(Elem *)
{
if(vh)+ %% velicina)
ealociaj(velicina)velicina);// "uplo ili ,,,
vh));
elementi&vh' % *;
}
template <typename Elem>
Elem !tac"#iz$Elem%&&izbaci()
{
vh--;
return elementi&vh)+'; // niz je jos uvijek tu
}
O(1) gotovo uvijek
O(n) - ponekad
O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
12/28
Sloenost pus- operacije
Sloenost pus- operacije

Sloenost pus- operacije je 2(,) sve dok se ne napuni


niz pomo(u kojeg je stack implementiran

ada je potrebno izvr*iti realokaciju niza %ime


pro*irujemo niz$ 2va operacije je 2(n)$

/akle# neke (mnoge) pus- operacije su 2(,) a samo


neke 2(n)$

Amortizovana analiza - dugoro%na analiza sekvence


operacija ili aplikacije"

dugoro%no gledano# ima(emo veliki broj pus-


koji su 2(,) i mali broj oni- koji su 2(n)$

moemo re(i da (e o%ekivano vrijeme za pus-


biti vi*e od vremena jednog upisa u niz (npr$
dva upisa) ali konstantno# odnosno 2(,)

Provjera da li je stack prazan (ako je vr- na indeksu -,


) stack je prazan)"
Fakultet elektrotehnike Univerziteta u Tuzli
13/28
Stack ) ostale operacije
Stack ) ostale operacije

3itanje vrijednosti elementa na vr-u (vrijednost


elementa sa indeksom na koji pokazuje vr-)"

Provjera da li je stack prazan (ako je vr- na


indeksu -, ) stack je prazan)"
Elem gornji()
{
return elementi'vrh(
}
Elem jePrazan()
{
return (vrh )) *+)
}
O(1)
O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
14/28
Stack ) implementacija povezanom listom
Stack ) implementacija povezanom listom

Stack pomo(u povezane liste moemo realizovati


kori*tenjem jedne od dvije strategije (koja je bolja+)"

,$ vr- stacka je na kraju liste (pokaziva% rep)

dodajemo na kraj i uklanjamo sa kraja liste


.$ vr- stacka je na po%etku liste (pokaziva% glava)

dodajemo na po%etak i uklanjamo sa po%etka


liste
2 5 8 1
glava
rep
8 1 2 5
glava
8
5
1
2
push: O(1), pop: O(1), top: O(1), chk: O(1)
push: O(1), pop: O(n), top: O(1), chk: O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
15/28
3vor liste
3vor liste
class ,vor
{
public&
int element
,vor- naredni
,vor(int e) & element(e). naredni(#/00) {}
}
%l%-%nt nar%dni
Fakultet elektrotehnike Univerziteta u Tuzli
1./28
Stack ) pop
Stack ) pop

Prilikom uklanjanja elementa (operacija pop) iz


ovakvog stacka treba voditi ra%una o tome da se
mora vratiti vrijednost elementa koji se uklanja$
8 1 2 5 glava
'
r
/
Elem pop()
{
,vor -temp ) glava
glava ) glava*%naredni
Elem v ) temp*%element
delete temp
return v
}
1 2 5 glava
'
r
/
O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
10/28
Stack ) ostale operacije
Stack ) ostale operacije

3itanje vrijednosti elementa na vr-u (vrijednost


elementa na koji pokazuje glava)"

Provjera da li je stack prazan (ako glava ne


pokazuje ni na jedan element ) stack je prazan)"
Elem gornji()
{
return glava*%element
}
bool jePrazan()
{
return (glava )) 1)
}
O(1)
O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
18/28
Red (queue) ) implementacija pomo(u niza
Red (queue) ) implementacija pomo(u niza

Red pomo(u niza moemo realizovati tako *to (emo


imati dva markera"

prednji ) indeks prednjeg elementa u redu

zadnji ) indeks na zadnjeg elementa u redu


/odaje se na jedan kraj a uklanja sa drugog ) razmatranja
kao kod liste implementirane nizom

pri uklanjanju prednjeg moramo sve pomjeriti


ulijevo$ !sto je ako obrnemo poredak$
4 8 5 1 2
ulaz izlaz
4 8 5 1 2
. . .
prednji element
(izlaz iz reda)
zadnji element (ulaz u red)
O(n)
Fakultet elektrotehnike Univerziteta u Tuzli
11/28
Red (queue) ) implementacija pomo(u niza
Red (queue) ) implementacija pomo(u niza

4olji pristup je da samo pomjeramo markere za prednji i


zadnji element"
4 8 5 1 2
. . .
prednji prednji
zadnji
8 5 1 2
. . .
prednji
zadnji
...
8 5 1
2 0
. . .
prednji
zadnji
Pro*l%-: 6ta )ad do7%-o do )raja niza8 $%alocirati niz ili s'%
+r%*aciti lij%'o8 9ta god od o'og da uradi-o :; "(n)
iz*aci
u*aci
4 8 5 1 2
ulaz izlaz
Fakultet elektrotehnike Univerziteta u Tuzli
24/28
5irkularni bafer (circular buffer)
5irkularni bafer (circular buffer)

5irkularni bafer je niz kod kojeg su spojena dva kraja"


Pro*l%-: 6ta )ad do7%-o do )raja niza8
4
1
3
2
4
5
.
0
...
8 5 1
2 0
. . .
prednji
zadnji
zadnji22
if(zadnji )) velicina)
zadnji ) 1
ili
zadnji ) (zadnji2+) 3 "apacitet
Fakultet elektrotehnike Univerziteta u Tuzli
21/28
Red ) ubacivanje i izbacivanje elemenata
Red ) ubacivanje i izbacivanje elemenata

1bacivanje elementa u red (enqueue. push)

!zbacivanje elementa iz reda (dequeue. pop)"


void ubaci(Elem x)
{
zadnji ) (zadnji 2 +) 3 velicina
elementi'zadnji( ) x
br4elemenata22
}
Elem izbaci()
{
Elem temp ) elementi'prednji(
prednji ) (prednji 2 +) 3 br4elemenata
br4elemenata**
return temp
}
O(1)
O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
22/28
Red ) provjera da li je red prazan ili pun
Red ) provjera da li je red prazan ili pun

Prije ubacivanja elementa u red treba provjeriti da li je


red pun"

Prije izbacivanja elementa iz reda treba provjeriti da li


je red prazan"
bool jePun()
{
return (br4elemenata )) velicina)
}
bool jePrazan()
{
return (br4elemenata )) 1)
}
O(1)
O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
23/28
Red nizom ) pove(anje kapaciteta
Red nizom ) pove(anje kapaciteta

Pove(anje kapaciteta cirkularnog bafera ima svoje


specifi%nosti u odnosu na pove(anje obi%nog niza$

6ije dovoljno samo kopirati elemente niza na iste


indekse$

7lementi moraju imati isti poredak u redu a ne u nizu$


+
z
+
z 8 8 8 8 8
z
+
8 8 8 8 8
+
z
8 8 8 8 8
<E
=,
=,
Fakultet elektrotehnike Univerziteta u Tuzli
24/28
Red ) implementacija povezanom listom
Red ) implementacija povezanom listom

Red pomo(u povezane liste moemo realizovati


kori*tenjem jedne od dvije strategije (koja je bolja+)"

,$ ulaz u red je na po%etku liste

dodajemo na po%etak i uklanjamo sa kraja liste


.$ ulaz u red je na kraju liste

dodajemo na kraj i uklanjamo sa po%etka liste


2 5 8 1
glava
rep
8 1 2 5
glava
enq: O(1), deq: O(1), front: O(1), chk: O(1)
enq: O(1), deq: O(n), front: O(1), chk: O(1)
8 5 1 2
ulaz izlaz
rep
izlaz
ulaz
ulaz
izlaz
Fakultet elektrotehnike Univerziteta u Tuzli
25/28
Red ) ubacivanje i izbacivanje elemenata
Red ) ubacivanje i izbacivanje elemenata

1bacivanje elementa u red (enqueue. push)

!zbacivanje elementa iz reda (dequeue. pop)"


void ubaci(Elem x)
{
rep*%naredni ) ne5 ,vor(x)
rep ) rep*%naredni
}
Elem izbaci()
{
,vor -temp ) glava
glava ) glava*%naredni
Elem elem ) temp*%element
delete temp
return elem
}
O(1)
O(1)
Fakultet elektrotehnike Univerziteta u Tuzli
2./28
Red i stog ) usporedba implementacija
Red i stog ) usporedba implementacija

8ao *to smo vidjeli# sve osnovne operacije imaju


sloenost 2(,)$ /a li koristiti implementaciju pomo(u
niza ili povezane liste+

!mplementacija memorijom"

brzo dodavanje i uklanjanje

moe zauzimati mnogo vi*e memorije nego *to


treba

!mplementacija povezanom listom

dodavanje i uklanjanje za-tijeva malo vi*e


vremena zbog dinami%ke alokacije

bolja iskoristivost memorije# mada svaki %vor


zauzima vi*e memorije nego kod niza

Ako je koli%ina memorije kriti%an faktor koristiti imple-


mentaciju nizom sa realokacijom pri svakoj promjeni
Fakultet elektrotehnike Univerziteta u Tuzli
20/28
Stog (stack) ) S9 implementacija
Stog (stack) ) S9 implementacija

:eader $stac"%# klasa stac"

'etodi"

size ) broj elemenata u stacku

empty ) vra(a true ako je prazan# false ako nije

push(x) ) ubacuje element u stack

pop ) izbacuje i vra(a element sa vr-a stacka

top ) vra(a element sa vr-a stacka

8ori*tenje"
6include$stac"%
777
stac"$int% int!te"
Fakultet elektrotehnike Univerziteta u Tuzli
28/28
Red (queue) ) S9 implementacija
Red (queue) ) S9 implementacija

:eader $queue%# klasa queue

'etodi"

size ) broj elemenata u redu

empty ) vra(a true ako je prazan# false ako nije

push(x) ) ubacuje element u red

pop ) izbacuje i vra(a element sa po%etka reda

front ) vra(a element sa po%etka reda

bac" ) vra(a element sa kraja reda

8ori*tenje"
6include$queue%
777
queue$int% int8ed

You might also like