Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 25

PANEVROPSKI UNIVERZITET APEIRON

FAKULTET POSLOVNE INFORMATIKE



Redovne studije
,Inzenjering informacionih tehnologija~



Predmet
PRINCIPI PROGRAMIRAN1A



,OSNOVNE STRUKTURE PODATAKA~
(seminarski rad)




Predmetni nastavnik
Prof. dr Zoran Z. Avramovic, dipl.inz.elek.


Student
Goran Dakovic 020-08/RPI


Banja Luka, mart 2010.




2



SADRZAJ :



- Apstraktne strukture podataka 3


- Osnovne apstraktne strukture podataka 4


- Apstraktna struktura podataka LISTA 5


- Apstraktna struktura podataka STEK 11


- Apstraktna struktura podataka RED ZA CEKANJE 14


- Apstraktna struktura podataka BINARNO STABLO 17















3

OSNOVNE STRUKTURE PODATAKA


1.1. Apstraktne strukture podataka

Apstraktna struktura podataka (ili krace ASP) je matematicki model skupa objekata
zajedno sa kolekcijom operacija koje su deIinisane u tom modelu. Dakle, skup (kolekcija)
povezanih podataka sa skupom operacija nad tim podacima naziva se apstraktnom strukturom
podataka. Na primjer, apstraktna struktura podataka stek modelira dinamicki skup objekata pri
cemu se iz tog skupa uvijek uklanja onaj objekat koji je posljednji dodat skupu.
Tako, stekom se realizuje nacin rada sa podacima koji se kolokvijalno naziva ,posljednji usao,
prvi izasao' ( engl. last in, Iirst out, LIFO ). Za razliku od toga, apstraktna struktura podataka red
:a cekanfe modelira dinamicki skup objekata kod koga je uklonjeni objekat onaj najstariji, tj.
onaj koji se u skupu nalazi najduze vrijeme. Redom za cekanje se realizuje nacin rada sa
podacima koji se naziva ,prvi usao, prvi izasao' ( engl. Iirst in, Iirst out, FIFO).
U programskom jeziku, termini struktura podataka, tip podataka ili tip su sinonimi i odnose se na
konkretnu reprezentaciju podataka i sve operacije dozvoljene nad tim podacima. Preciznije, oni
oznacavaju skup vrijednosti koje neka promjenljiva odgovarajuceg tipa moze imati, zajedno sa
skupom operacija koje su dozvoljene nad promjenljivima tog tipa. Na primjer promjenljiva
logickog tipa moze imati vrijednost true ili false, i nijednu drugu vrijednost. Dozvoljene
operacije su su uobicejene logicke operacije negacije, konjunkcije, disjunkcije i tako dalje.
Svaki programski jezik obezbjeduje neke osnovne strukture podataka. One se razlikuju od jezika
do jezika, ali vecina njih cjelobrojni, realni, logicki i znakovni tip podataka. Svaki programski
jezik sadrzi i pravila za konstruisanje slozenih tipova podataka polazeci od osnovnih, koji se
takode razlikuju od jezika do jezika.
Apstraktne strukture podataka, kao sto im i naziv govori, su apstrakcije struktura podataka, a
posto su algoritmi apstrakcije programa, algoritme obicno konstruisemo pomocu apstraktnih
struktura podataka. Ipak, to bas nije uvijek moguce, jer ponekad moramo da znamo same detalje
reprezentacije matematickog modela koji stoji iza apstraktne strukture podataka. Na primjer,
neki graIovski algoritmi zavise od toga da li je graI predstavljen matricom susjedstva ili
matricom grana.
Apstraktne strukture podataka su generalizacije primitivnih tipova podataka ( cjelobrojni, realni
itd. ), bas kao sto su procedure generalizacije primitivnih operacija ( sabiranje, oduzimanje itd. ).
Apstraktna struktura podataka zaokruzuje neki tip podataka u smislu da se deIinicija tog tipa i
sve operacije nad tim tipom mogu lokalizovati u jednom dijelu programa. To je od velike
prakticne vaznosti, jer ako zelimo da promijenimo realizaciju apstraktne strukture podataka,
najprije znamo gdje to traba uciniti. Drugo, znamo da ako promijenimo mali dio programa,
necemo izazvati tesko uocljive greske u nekom drugom dijelu koje nemaju veze sa
odgovarajucim tipom podataka. Najzad, izvan dijela u kojem je apstraktna struktura podataka
realizovana, mozemo raditi sa njom kao da je to primitivna struktura i ne obracati paznju na
njenu konkretnu realizaciju.
Prema tome, apstraktne strukture podataka imaju dva pozeljna svojstva, generalizacju i
enkapsulaciju koje nam omogucavaju da ispunimo vazan cilj soItverskog inzenjerstva -
visekratnu upotrebljivost. Naime, posto implementiramo apstraktnu strukturu podataka, mozemo
je koristiti u razlicitim aplikacijama. Prakticno, apstraktna struktura podataka deIinise interIejs
izmedu korisnika i podataka.


4


1.2. Osnovne apstraktne strukture podataka
Strukture podataka se bave organizacijom podataka i nacinom njihovog memorisanja u
kompjuterima.
Najjednostavniji mehanizmi za grupisanje podataka u vecini modernih programskih jezika su
nizovi, slogovi i pokazivaci. Oni predstavljaju osnovne gradivne elemente za konstruisanje
slozenih struktura podataka.
Niz predstavlja kolekciju objekata (podataka) istog tipa smjestenih u memoriji u uzastopnim
memorijskim lokacijama kao sto prikazuje sljedeca slika.


Slika 1.1. : Niz


U gornjem primjeru prikazan je slucaj jenog niza od n elemenata (zapazite da brojanje pocinje od
0), gdje citav niz ima zajednicko ime p.
Pojedinacnom elementu niza pristupa se tako sto se pored imena niza u zagradi navede i redni
broj (indeks) tog elementa u nizu. Tako je p|14| podatak koji se nalazi u 15-tom elementu niza p.
Treba ovdje jos istaci da elementi niza mogu biti proizvoljni objekti, pa cak i nizovi. Tako nizovi
mogu sadrzati kao elemente brojeve (cijele i decimalne), slova, slike, itd.
U programskim jezicima pokazivaci su promjenljive koje sadrze adresu objekta na koji
pokazuju, jer je jedino svojom adresom svaki objekat jednoznacno odreden. Pokazivac ima svrhu
da cuva adresu memorijske lokacije neke druge promjenljive, konstante ili pokazivaca.

Operacije koje su deIinisane nad apstraktnim strukturama podataka se veoma razlikuju od
strukture do strukture, ali sve strukture imaju bar dvije zajednicke operacije : jednu za dodavanje
novih elemenata kolekciji, kao i onu za uklanjanje starih elemenata iz kolekcije podataka koja
cini odgovarajucu strukturu podataka.
Ovdje bismo mogli dodati i operaciju za stvaranje potpuno nove, prazne strukture podataka.
Medutim, ona umnogome zavisi od konkretnog programskog jezika i detalji su prilicno trivijalni,
a posto nas uglavnom interesuju vremena izvrsavanja slozenijih operacija, obicno cemo
preskociti ovu operaciju ,konstruktora' strukture podataka. Pored toga, iz naseg idealizovanog
ugla gledanja zanemaricemo i ostale implementacione detalje, kao sto su provjera gresaka i
oslobadanje memorije onih elemenata koji vise nisu potrebni.
U druge tipicne operacije nad struktueama podataka spadaju, na primjer, odredivanje da li se dati
element nalazi u nekoj strukturi podataka, preuredivanje elemenata strukture podataka u nekom
redosljedu, izracunavanje aktuelna velicine ( broja elemenata ) strukture podataka i tako dalje.
Uopsteno govoreci, operacije nad strukturama podataka se mogu podijeliti u dvije kategorije. To
su upiti, koji kao rezultat daju neku inIormaciju o strukturi podataka ne mjenjajuci je, i
modifikufuce operacife, koje mjenjaju sadrzaj strukture podataka.
Vrijeme za izvrsavanje neke operacije nad apstraktnom strukturom podataka se obicno izrazava
u zavisnosti od aktuelne velicine odgovarajuce kolekcije podataka. Na primjer, ako lista ima n
elemenata, za operaciju koja pronalazi dati element u listi, mozemo reci da se izvrsava vrijeme
O(n).



5

1.3. Apstraktna struktura podataka LISTA

!ove:ana lista ili kratko lista ima vrlo Ileksibilnu strukturu posto, pored svojstva da se lista
moze dinamicki povecavati ili smanjivati, njenim elementima se moze pristupiti ili joj se
elementi mogu dodati ili ukloniti na svakom mjestu u listi. Liste se mogu spajati ili dijeliti u
podliste. One se primjenjuju u mnogim oblastima racunarstva koje obuhvataju prevodenje
programskih jezika, upravljanje memorijomi izdvajanje inIormacija.
Apstraktna struktura podataka lista predstavlja povezanu listu u kojoj su element datog tipa
poredani po linearnom redosljedu. Za razliku od niza, kod koga je linearni poredak implicitan na
osnovu indeksa niza, poredak u listi je odreden pokazivacem u svakom elementu. pogodno je
pretpostaviti postojanje specijalnog pokazivaca nil, koji ne pokazuje ni na jedan element. Na taj
nacin mozemo uniIormno tretirati elemente liste i reci da posljednji element sadrzi pokazivac nil.
Za one koji vise vole matematicku deIiniciju mozemo reci da je lista ( x
1
...x
n
) sekvenca nula ili
vise elemenata datog tipa, pri cemu je tip indeksa elemenata odreden nekom Iunkcijom
,sljedbenika'. Ipak, prava priroda apstraktne strukture lista najbolje se vidi iz njene slikovite
reprezentacije date na slici 1.2.

Za broj elemenata n kazemo da je to velicina liste. Ako je n _ 1, kazemo da je x
1
prvi element i
x
n
posljednji element liste. Ako je n 0, imamo praznu listu koja nema elemenata.






Slika 1.2. : Apstraktna struktura podataka lista


Vazno svojstvo liste je da se njeni elementi mogu linearno poredati prena njihovim pozicijama u
listi. Za i 1,2....n-1, kazemo da je element x
i
prethodnik elementa x
i1
, a element x
i1
je
slfedbenik elementa x
i
. Prvi element ili glava liste, nema prethodnika, a posljedni element ili rep
liste, nema sljedbenika.
Da bismo ilustrovali tipicne operacije nad listom, svaki element liste predstavljamo jednim
objektom koji sadrzi polje kljuca key i pokazivacko polje next. Ovaj objekat moze sadrzeti i
dodatna polja za druge podatke koji su vazni za odgovarajucu primjenu.
Ako je dat pokazivac x na neki objekat u listi, koristimo zapis field (x) za oznacavanje dva
koncepta : za samo polje pod imenom field objekta na koji pokazuje x, kao i za sadrzaj tog
polja. Na primjer, key (x) i next (x) oznacavaju polja key i next onog objekta na koji pokazuje x,
kao i Iunkcije koje kao rezultat daju, redom, vrijednosti kljuca i pokazivaca koje se nalaze u tim
poljima objekta na koji pokazuje x.
Pored toga, cesto cemo identiIikovati objekat i pokazivac koji pokazuje na taj objekat. Tako,
umjesto Iraze ,pokazivac x koji pokazuje na neki objekat' reci cemo prostije ,objekat ili element
x', znajuci da je x zapravo pokazivac na neki objekat. Ne samo to, ako su podaci kljuca objekta x
irelevantni, i njih cemo kratko zvati x. Ovo vazi i za ostale strukture podataka.
x
1
x
2
x
n-1
x
n


6

U nasoj reprezentaciji, svaka lista ima i jedinstven atributni objekat sa dva polja : jedno je polje
name, koje sadrzi ime liste, a drugo je pokazivacko polje head koje pokazuje na prvi element
liste. Ovaj atributni objekat se identiIikuje imenom liste. Tako, konkretna lista L je odredena
atributnim objektom cije polje name sadrzi L. Slicno prethodnom zapisu za polja elemenata,
polje head atributnog objekta L se oznacava zapisom head (L), koji daje i pokazivac na glavu
liste L. Dakle, ako je head (L) nil, tada je lista L prazna.
Svaka lista mora da zadovoljava sljedece osobine:
O Lista moze biti prazna
O Moguce je ubaciti novi element na bilo koju poziciju u listi
O Moguce je izbaciti bilo koji element iz liste
O Lista ima svoju velicinu, tj. broj elemenata
O Svakom elementu liste se moze pristupiti preko rednog broja, tj. indeksa
Po vrsti povezanosti, liste se najcesce dijele na fednostruko pove:ane i dvostruko pove:ane.


Inicijalizacija povezane liste
Da bismo inicijalizovali povezanu listu, mozemo koristiti sljedecu proceduru LIST - MAKE (L)
koja jednostavno pravi listu L praznom.


LIST - MAKE (L)
head (L) Nil;
return;

Vrijeme izvrsavanja procedure LIST - MAKE je O (1)


Dodavanje elementa u povezanu listu
Ako je dat (pokazivac na) objekat x i (pokazivac na) element p list L, sljedeca procedura LIST -
INSERT (L, x, p) dodaje novi element x u L iza elementa p.

LIST - INSERT (L, x, p)
next(x) next (p);
next(p) x;
return;






7

Na slici 1.3. je prikazano kako se neki element dodaje u listu.

p







x

Slika 1.3. : Dodavanje elementa u listu

Procedura LIST - INSERT ne moze dodavati neki element na poctak liste. Sljedeca procedura
radi upravo to.


LIST - HEAD - INSERT (L, x)
next(x) head (L);
head (L) x;
return;

Posto su sve operacije u procedurama LIST - INSERT i LIST - HEAD - INSERT osnovne,
vrijeme izvrsavanja obje procedure nad listom od n elemenata iznosi O(1).

Uklanjanje elementa iz liste

Ako je dat (pokazivac na) element p liste L, procedura LIST - DELETE (L, p) uklanja element u
L koji se nalazi iza elementa p. Ta procedura vraca i pokazivac na uklonjeni element kako bi
pozivajuca procedura mogla da oslobodi jegove resurse koje zauzima.


LIST - DELETE (L, P)
x next (p);
next (p) next (x);
return x; | Iree (x) |


a c
b


8

Na slici 1.4. je prikazano kako se neki element uklanja iz liste na ovaj nacin.

p x






Slika 1.4. : Uklanjanje elementa iz liste


Ni procedura LIST - DELETE ne moze ukloniti element na pocetku liste. Sljedeca procedura
radi upravo to.


LIST - HEAD - DELETE (L)
x head (L);
head (L) next (x);
return x; | Iree (x) |

Posto su sve operacije u procedurama LIST - DELETE i LIST - HEAD - DELETE osnovne,
vrijeme izvrsavanja obje procedure nad listom od n elemenata iznosi O (1).

Pretraga povezane liste

Procedura LIST - SEARCH (L, k) pronalazi prvi element sa kljucem k u listi L i vraca pokazivac
na taj element. Ako nije pronaden element sa kljucem k u listi, vraca se pokazivac NIL.


LIST - SEARCH (L, k)
x head (L);
while (x = NIL) (key (x) = k) do
x next (x);
return X;

Za pretragu liste od n elemenata, proceduri LIST - SEARCH (L,k) treba vrijeme O (n) u
najgorem slucaju, jer mozda mora da ispita cijelu listu.
a b c


9

Ukoliko zelimo da dodamo ili uklonimo element iza nekog elementa u listi sa datim kljucem,
najprije moramo pozvati proceduru List - Search da pronade taj element. Prema tome, vrijeme
izvrsavanja ovih operacija dodavanja ili uklanjanja bilo bi O (n) u najgorem slucaju.

Dvostruko povezane liste

Dvostruko povezanu listu prelazimo u oba smjera, a svaki element u dvostruko povezanoj listi
ima polje kljuca key i dva pokazivacka polja, prev koje pokazuje na prethodni element i next koje
pokazuje na sljedeci element.Ako je prev (x) NIL, element x nema prethodnika i zato je to prvi
element liste.

Kao kod jednostruko povezane liste, atributni objekat dvostruko povezane liste L, ima polje head
(L) koje pokazuje na glavu liste. Na slici 1.5. je prikazan primjer dvostruko povezane liste.




name head


prev key next


Slika 1.5. : Dvostruko povezana lista

Druga prednost dvostruko povezane liste je u tome sto osnovne operacije dodavanja i uklanjanja
mogu kao parametar direktno koristiti odgovarajuci element, a ne manje prirodno koristiti
njegovog prethodnika.

Dodavanje elementa u dvostruko povezanu listu

Procedura LIST - INSERT - AFTER (L, p, x) dodaje element x iza elementa p:
LIST - INSERT - AFTER (L, p, x)
prev (x) p;
next (x) next (p)
iI next (p) NIL then
last (L) x
else
prev (next (p) ) x;
next (p) x
return L;
L
a b c d


10

Na slici 1.6. je prikazano dodavanje elementa x iza elementa p.




prev(p) p next(p)






x

Slika 1.6. : Dodavanje elementa x iza elementa p

Procedura LIST - INSERT - BEFORE (L, x, p) dodaje element x iza elementa p:
LIST - INSERT - BEFORE (L, x, p)
prev (x) prev (p)
next (x) p
iI prev (p) NIL then
head (L) x
else
next (prev(p) ) x
prev (p) x;
return L;

Na slici 1.7. je prikazano dodavanje elementa x ispred elementa p.


prev(prev(p)) prev(p) p next (p)





x
Slika 1.7. : Dodavanje elementa x ispred elementa p
a b c
d
a b c d
e


11

Uklanjanje elementa iz dvostruko povezane liste

Procedura DLList - Delete (L,x) uklanja element x iz dvostruko povezane liste L.


DLLIST- DELETE (L, x)
iI prev (x) = NIL then
next (prev(x) ) next (x)
else head (L) next (x);
iI next (x) = NIL then
prev (next(x) ) prev(x);
return x; | Iree(x) |


Na slici 1.8. je prikazano kako se neki element uklanja iz dvostruko povezane liste na ovaj nacin.


prev(x) x next(x)





Slika 1.8. : Uklanjanje elementa iz dvostruko povezane liste


1.4. Apstraktna struktura podataka STEK

Stek je specijalna vrsta liste kod koje se dodavanja i uklanjanja elemenata obavljaju na jednom
kraju koji se naziva vrh. Stek djeluje po principu LIFO (last-in-Iirst-out).
Poredak elemenata po kojem se oni uklanjaju sa steka je obrnut onom po kojem su oni dodati na
stek. Na apstraktnom nivou, atributivni objekat steka sadrzi polje name, kao i polje top koje
ukazuje na vrh steka.
Kao apstraktni tip podataka, stek se sastoji od cvorova, i ima dve osnovne operacije: push i pop.
!ush stavlja dati cvor na vrh steka, ostavljajuci prethodne cvorove ispod. !op uklanja i vraca
cvor koji je trenutno na vrhu. Stek se moze shvatiti kao nekoliko tanjira postavljenih jedan na
drugi. Ako zelimo da dodamo novi tanjir, stavljamo ga na vrh, a ukoliko nam je potreban tanjir,
uzimamo onaj sa vrha. Da bismo skinuli tanjir sa dna, prethodno moramo da skinemo sve tanjire
koji se nalaze na njemu. Samo nam je tanjir sa vrha dostupan, dok su ostali prekriveni. Kad se na
vrh doda novi tanjir, on postaje vrh steka. Ova metaIora ilustruje dva vazna principa: jedan je
a b c


12

princip LIFO (engl. Last in, first out - poslednji koji ulazi, prvi izlazi), a drugi je da je samo
tanjir sa vrha vidljiv, pa da bi se vidio treci tanjir, prvi i drugi moraju prvo da se sklone. Tipican
stek je deo u memoriji racunara sa Iiksiranim pocetkom, i promenljivom velicinom. Na pocetku,
velicina steka je nula. !oka:ivac na stek, obicno u vidu hardverskog registra, pokazuje na
posljednju iskoriscenu adresu na steku; kada je stek velicine nula, pokazivac pokazuje na
pocetak steka.
Implementacijom steka pomocu nizova moze se iskoristiti cinjenica da se dodavanja i
uklanjanja elemenata vrse samo na vrhu steka. Zato mozemo koristiti samo jedan niz, izjednaciti
dno steka sa pocetkom tog niza, a zatim uvecati stek prema kraju tog niza. Ovaj pristup je
ilustrovan na slici 1.9.

S






1 2 3 4 5 6 ... n





Slika 1.9. : Stek S predstavljen samo jednim nizom

Kao sto je prikazano na slici 1.9, stek od najvise n elemenata mozemo predstaviti nizom A
velicine n.
Stek je identiIikovan promjenljivom S koja ukazuje na vrh steka, tj. na poziciju posljednjeg
dodatog elementa. Kada je S 0, stek nema elemenata i kaze se da je prazan. Da li je stek prazan
mozemo provjeriti upitnom operacijom STACK - EMPTY.
Ako pokusavamo da uklonimo element iz praznog steka, kazemo da dolazi do potkoracenfa
steka (engl. underIlow). Kada je S n, stek je pun. Da li je stek pun mozemo provjeriti upitnom
operacijom STACK - FULL. Ako se dodaje element u pun stek, kazemo da dolazi do
prekoracenfa steka (engl. overIlow). Potkoracenja i prekoracenja steka obicno predstavljaju
programsku gresku.
Operacije nad stekom koji je predstavljen nizom mogu se lako realizovati pomocu nekoliko
programskih redova. Tipican stek je dio u memoriji racunara sa Iiksiranim pocetkom, i
promjenljivom velicinom. Na pocetku, velicina steka je nula. Postoji mnogo varijacija osnovnog
principa stek operacija. Svaki stek ima Iiksiranu lokaciju u memoriji, na kojoj pocinje. Kako se
podaci dodaju na stek, stek pokazivac se pomjera, kako bi oslikavao trenutno stanje steka, koje
se siri od njegovog pocetka (moze da se siri ka gore ili ka dole, zavisno od implementacije).
10
8
20
17
23 23 17 20 8 10 ...
S


13

Na primjer, stek moze da pocne na memorijskoj lokaciji 1000, i da se siri ka nizim adresama, i u
tom slucaju se novi podaci smestaju na adresama ispod 1000, i pokazivac na stek se umanjuje
svaki put kad se novi podatak doda. Kad se podatak ukloni sa steka, pokazivac na stek se
uvecava.
Pokazivac na stek moze da pokazuje na pocetak steka, ili na ograniceni opseg iznad ili ispod
pocetka (u zavisnosti od toga u kom smjeru stek raste); medutim, on ne moze da prede pocetak
steka. Drugim rijecima, ako je pocetak steka na adresi 1000, i stek raste na dolje (prema
adresama 999, 998, i tako dalje), pokazivac na stek ne smije nikad da bude uvecan iznad 1000
(na 1001, 1002, i tako dalje). Ako pop operacija dovede do toga da pokazivac na stek prede
preko pocetka steka, dolazi do potkoracenfa steka (stack underflow). Ako push operacija dovede
do toga da se pokazivac na stek uveca ili umanji preko maksimalne velicine steka, dolazi do
prekoracenfa steka (stack overflow). Stek je u racunarima obicno predstavljen blokom
memorijskih celija, sa dnom na Iiksiranoj lokaciji, a pokazivac na stek cuva adresu trenutnog
vrha steka.
Neka okruzenja se u velikoj meri oslanjaju na stekove mogu da pruzaju i dodate operacije, na
primer:
O uplicate: vrh steka se duplira, tako sto se novi primjerak tog podatka postavi na stek,
tako da original ostane ispod njega.
O !eek: vrh steka se vraca, ali se pokazivac na stek ne mjenja, kao ni velicina steka (sto
znaci da podatak ostaje na steku). Ova operacija se takode cesto naziva top.
O $wap ili exchange: dva elementa najbliza vrhu steka mjenjaju mjesto.
O #otate: n elemenata steka najblizih vrhu se premjestaju na steku, tako sto se rotiraju. Na
primjer, ako je n3, podaci 1, 2, i 3 na steku se premestaju na pozicije 2, 3, i 1 redom.
Moguce su mnoge varijacije ove operacije, a najcesce su rotiranje ulijevo (left rotate) i
rotiranje udesno (right rotate).
Algoritam koji provjerava da li je stek prazan :

STACK - EMPTY (S)
iI S 0 then
return TRUE;
else
return FALSE;

Algoritam koji provjerava da li je stek pun :

STACK - FULL (S)
iI S n then
return TRUE;
else
return FALSE;



14

Algoritam koji pravi prazan stek :


STACK - MAKE (S)
S 0
return S;


Algoritam koji dodaje element na stek :

PUSH (S, x)
iI STACK - FULL (S) then
return ,overIlow' ;
else
S S1;
A (S) x;
return S;


Algoritam koji uklanja element iz steka :

POP (S)
iI STACK - EMPTY (S) then
return ,underIlow' ;
S S - 1;
return S, x;



1.5. Apstraktna struktura podataka RED ZA CEKAN1E

#ed :a cekanfe (engl. QUEUE) je vrsta povezane liste kod koje se elementi dodaju na jednom
kraju, a uklanjaju sa drugog kraja liste. Red ima prvi element kojeg nazivamo glava(engl.head) i
posljednji element kojeg nazivamo rep(engl.tail).
Kada se element dodaje u red, taj novi element se prikljucuje na kraj reda, a kada se element
uklanja iz reda, izbacuje se prvi element reda, tj. red za cekanje radi po principu FIFO (Iirst-in-
Iirst-out). Red oznacavamo sa Q.


15

Slicno stekovima, i nad redovima se mogu vrsiti dve operacije: umetanje u red (Insert) i
operacija uklanjanja iz reda (delete). Razlika u odnosu na stek je samo u tome sto se, iz reda
uzima element koji je najduze proveo cekajuci u redu. I redovi su cesti u racunarstvu: koriste se
za organizovanje razlicitih aktivnosti tokom izvrsavanja programa. Prioritetni redovi se od
obicnih razlikuju po tome sto se pri umetanju podatka u red, podatku dodjeljuje prioritet, a pri
vadenju iz reda, iz reda se uzima element sa najmanjim/najvecim prioritetom.
Na slici 2.1. je prikazan red za cekanje implementiran pomocu liste:



glava tekuci rep






Slika 2.1. : Implementacija reda pomocu liste




Algoritam koji pravi prazan red :


QUEUE- MAKE (Q)
head 1;
tail n;
lenght 0;
return;

Algoritam koji provjerava da li je red prazan :


QUEUE - EMPTY (Q)
iI lenght (Q) 0 then
return TRUE;
else
return FALSE;
a
1
a
2
a
3
a
4


16

Algoritam koji provjerava da li je red pun :

QUEUE FULL (Q)
iI lenght (Q) n then
return TRUE;
else
return FALSE;

Algoritam koji dodaje element x u red :

ENQUEUE (Q, x)
iI QUEUE - FULL (Q) then
return ,overIlow';
else
tail tail 1;
A (tail) x;
lenght lenght 1;
return;

Algoritam koji uklanja element x iz reda :


DEQUEUE (Q)
iI QUEUE - EMPTY (Q) then
return ,underIlow';
else
x A (head);
head head 1;
lenght lenght - 1;
return x;









17

1.6. Apstraktna struktura podataka BINARNO STABLO
Binarno stablo (engl. binary tree) je u inIormatici struktura namjenjena cuvanju podataka.
Njene memorijske jedinice su organizovane po principu piramide. Tacnije, svaka memorijska
jedinica (cvor) binarnog stabla moze da pokazuje na jos najvise dva elementa (njegova dfeca),
dok stablo ima samo jedan elemenat na koga ne pokazuje ni jedan drugi (korien). Od ovog
elementa se moze doci u bilo koji drugi elemenat stabla.













Slika 2.2. : Primjer binarnog stabla


Binarno stablo predstavlja se u obliku povezane strukture podataka u kojoj se svaki cvor
predstavlja jednim objektom koji sadrzi polje kljuca (key) i dva pokazivacka polja (pointera), tj.
left, koje pokazuje na lijevo podstablo objekta i right, koje pokazuje na desno podstablo objekta.
Operacije nad binarnim stablima su :
O dodavanje novog elementa
O brisanje postojeceg elementa
O prolazak: preorder, inorder, postorder


Binarno stablo pretrage
Binarno stablo pretrage je binarno stablo u kojem svaki cvor x ima osobinu da svi cvorovi u
lijevom podstablu cvora x imaju kljuceve manje od kljuca cvora x, a svi cvorovi u desnom
podstablu cvora x imaju kljuceve vece od cvora x.





12
7
15
5 8 17


18

Na slici 2.3 dat je primjer binarnog stabla pretrage:














Slika 2.3. : Primjer binarnog stabla pretrage


Dodavanje cvora u binarno stablo pretrage
Novi cvor x sa kljucem k dodajemo u binarno stablo tako sto poredimo kljuc k sa kljucem
korijena. Ako je kljuc k veci od kljuca korijena tada element x smjestamo u podstablo koje se
nalazi sa desne strane od korijena, a ako je kljuc k manji od kljuca korijena onda element x
smjestamo u podstablo koje se nalazi sa lijeve strane od korijena.





















42
35 55
20 31 50 67


19

Na slici 2.4 dat je primjer dodavanja cvorova sa kljucevima 8, 19 i 40 u binarno stablo:


































Slika 2.4. : Dodavanje cvora u binarno stablo


17
25
12
31 20
15 7
17
25
12
15
7
20 31
8 19 40


20


Uklanjanje cvora iz binarnog stabla
1) Uklanjanje cvora koji nema potomaka
Cvor koji nema potomaka (30) se jednostavno ukloni iz stabla sto mozemo vidjeti na sljedecoj
slici:
































Slika 2.5.: Uklanjanje cvora koji nema potomaka iz binarnog stabla

17
25 12
15 9 20 32
30
17
25
12
15
9
20 32


21



2) Uklanjanje cvora koji ima jednog potomka
Ukoliko cvor kojeg zelimo ukloniti (32) ima samo jednog potomka (30) onda cvor (32)
zamjenjujemo tim potomkom, sto je prikazano na sljedecoj slici:
































Slika 2.6.: Uklanjanje cvora koji ima jednog potomka

17
12 25
9 15 20 32
30
17
12 25
9 15 20 30


22


3) Uklanjanje cvora koji ima dva potomka
Ukoliko cvor kojeg zelimo ukloniti (roditelj - 35) ima dva potomka, tada trazimo cvor sa
najmanjim kljucem u njegovom desnom podstablu ili cvor sa najvecim kljucem u njegovom
lijevom podstablu i potomak zauzima mjesto svog roditelja, a roditelja uklonimo, sto mozemo
vidjeti na slici 2.7.

































Slika 2.7.: Uklanjanje cvora koji ima dva potomka
25
35 18
22
15
32 42
28 34 38 49
25
38
18
15
22 32 42
28 34 49


23


Algoritmi prolaska kroz binarno stablo

Preorder algoritam
Preorder algoritam se moze iskazati na sledeci nacin, sa tri koraka.
Preorder: 1. Posjeti korijen
2. Posjeti lijevi dio stabla (levo podstablo)
3. Posjeti desni dio stabla (desno podstablo)

Korak 1. je eksplicitan. U njemu se posjecuje koren, tj. jest cvor koji je na vrhu stabla (ili
podstabla, kada se posjecuje podstablo). Koraci 2 i 3 su implicitni (rekurzivni), jer nam ne kazu
koji cvor treba posjetiti, vec nam daju uputstvo kako nastaviti sa prolazom kroz lijevo ili desno
podstablo. Zapravo posjeta lijevom (ili desnom) podstablu ce se vrsiti istim ovim preorder
algoritmom, ali sada primjenjenim na podstablu. I tako redom dok god ima novih podstabala. Na
slici 2.8 imamo preorder prolazak kroz stablo.











Slika 2.8.: Preorder prolazak kroz stablo

Ako primjenimo preorder algoritam, imamo:
Korak 1. Posjetimo korijen stabla. Dakle, posjetimo vrh koji sadrzi podatak a i oznacimo
ga posjecenim.
Korak 2. Sada treba da posjetimo lijevo podstablo, tj. stablo koje ima cvorove b, c, d, e, f.
Posjetimo ga opet istim algoritmom, ali sada primjenjenim na ovo podstablo. A to znaci:
Korak 1. Posjeti korijen. Znaci posjeti i oznaci posjecenim cvor b (koji je korijen
podstabla koji upravo posjecujemo).
Korak 2. Posjeti lijevo podstablo tekuceg podstabla. To je podstablo koje se
sastoji od samo jednog cvora cvora c. Tako imamo:
Korak 1. Posjeti korijen oznaci c posjecenim.
Korak 2. Nema lijevog podstabla.
Korak 3. Nema desnog podstabla.
Znaci, nastavljamo sa korakom 3 za lijevo podstablo originalnog stabla.
Korak 3. Posjeti desno podstablo. To je podstablo sa cvorovima d, e, f.
Korak1. Posjeti korijen to je cvor d.
Korak 2. Posjeti levo podstablo. To je samo jedan cvor e.
Korak 3. Posjeti desno podstablo. To je samo jedan cvor f.
Sada se vracamo na korak 3 za pocetno stablo.
Korak 3. Sada treba da posjetimo desno podstablo, tj. stablo koje ima cvorove g, h, i.
Korak1. Posjeti korijen to je cvor g, oznacimo ga posjecenim.
Korak 2. Posjeti levo podstablo nema
Korak 3. Posjeti desno podstablo to je stablo sa cvorovima h i i.

a
b g
c
d
h
i e I


24

Korak 1. Posjeti korijen to je cvor h, oznaci ga posjecenim.
Korak 2. Posjeti lijevo podstablo to je samo jedan cvor, i, oznaci ga
posjecenim.
Korak 3. Posjeti desno podstablo nema.
Time je algoritam zavrsen. Redosljed posjete cvorova je sljedeci: a, b, c, d, e, f, g, h, i.

Slican postupak se provodi i za druga dva nacina prolazaka kroz stablo:
Inorder: 1. Posjeti lijevo podstablo
2. Posjeti korijen
3. Posjeti desno podstablo
Postorder: 1. Posjeti lijevo podstablo
2. Posjeti desno podstablo
3. Posjeti korijen





























25



Literatura :
- DEJAN ZIVKOVIC, Osnove dizajna i analize algoritama, Beograd, 2007.
- http://www.osnove-programiranja.com/predavanja/0620Osnovne20strukturepodataka.
pdI (19.02.2010.)

You might also like