You are on page 1of 15

3.

Linearne strukture

Polja
3.a) jednodimenzionalna (nizovi, vektori)
3.b) dvodimenzionalna (matrice)
višedimenzionalna (tenzori višeg reda)

3.c) Povezani popis


3.d) Stogovi
3.e) Redovi
3.e) Definicija reda

Princip rada kod reda (eng. Queue) je FIFO (eng. First In


First Out).
Red kao struktura podataka definiran je pomoću četiri
funkcije:

Push(x) - dodaje element x na kraj reda zove se još i Enqueue(x)


Pop( ) - vraća kao rezultat element s početka reda i briše ga,
zove se još i Dequeue()
Clear( ) - briše sve elemente reda
Is_empty( ) - vraća TRUE ako je red prazan, inače FALSE
Izvedba reda pomoću niza

Nije dovoljan samo niz V od N elemenata, potrebna


su i dva dodatna podatka Ulaz i Izlaz. To su dva
cijela broja koji pokazuju na početak i kraj reda.

Postoje dvije osnovne izvedbe reda pomoću niza:


- konačni red (u praksi se ne koristi)
- ciklički red
Konačni red
Prilikom stavljanja podatak u redi i prilikom
vađenja podataka iz reda, Ulaz i Izlaz se
povećavaju.
Nakon N uzastopnih korištenja Push i Pop funkcija,
konačni red postaje neupotrebljiv iako još uvijek
ima veliki nepopunjeni dio. Popunjeni dio reda

V 1 2 3 N

Izlaz Ulaz
Ciklički red
U cikličkom redu, nakon što se popuni N-ti podatak, red se i dalje
puni od početka tj. od prvog mjesta. Ovo je dobro za praktičnu
upotrebu!
N 1 U cikličkom redu se ulazni pokazivač
N-1 2
3 povećava izrazima: Ulaz = Ulaz+1
4
Ako je Ulaz>N onda Ulaz=1
Isto vrijedi i za izlazni pokazivac.
Ciklički red je prazan ako je
Ulaz = Izlaz – 1
i zadnja promjena bio je Pop( ).
Ciklički red je pun ako je
Ulaz = Izlaz – 1
i zadnja promjena bio je Push( x ).
Izvedba procedure Clear( )
i funkcije Is_empty( )
Kako moramo pamtiti koja je zadnja operacija bila, kod cikličkog
reda nam je potrebna još jedna logička varijabla: Zadnji_push

Algoritam procedure Clear( )


Ulaz = 1
Izlaz = 2
Zadnji_push = FALSE

Algoritam funkcije Is_empty( )


Ako je Ulaz = Izlaz – 1 i nije Zadnji_push onda
Vratiti TRUE
Vratiti FALSE
Izvedba procedure Push( x )

Push( x ) se naziva i Enqueue( x )

Algoritam procedure Push( x )


Ako je Ulaz = Izlaz – 1 i Zadnji_push onda
Ispiši “Queue overflow. Aborting...”
Završi algoritam /* obavezan prekid programa! */
Zadnji_push = TRUE
Ulaz = Ulaz + 1
Ako je Ulaz >N onda Ulaz = 1
VUlaz = x
Izvedba funkcije Pop( )

Pop( ) se naziva i Dequeue( )

Algoritam funkcije Pop( )


Ako je Is_empty( ) onda
Ispiši “Illegal POP. Aborting...”
Završi algoritam /* obavezan prekid programa! */
Zadnji_push = FALSE
x = VIzlaz
Izlaz = Izlaz + 1
Ako je Izlaz >N onda Izlaz = 1
Vratiti x
Analiza četiri funkcije za red

Sve četiri operacije su “atomske”, složenost je O(1).

Općenito, nedostatak cikličkih redova, kao i kod stogova


je ograničen broj od N mjesta za podatke.

U nekim primjenama teško je odrediti koliki N treba biti.


Izvedba reda pomoću povezane liste

Dovoljna je jedna povezana lista za izvedbu reda.


Ali, za efikasnu izvedbu osnovnih operacija
potrebna je povezana lista koji ima pokazivač na
prvi i pokazivač na zadnji zapis.

Sve četiri osnovne funkcije se onda mogu izvesti kao


“atomske”, međutim procedura Clear( ) u svojoj
pravilnoj izvedbi može zahtjevati O(n) operacija
(n – broj elemenata u redu).
Izvedba procedure Push( x )
(povezana lista)
Algoritam procedure Push( x )
novi = novi osnovni element liste (dinamičko alociranje)
Ako je novi = NULL onda
Ispiši “Queue overflow. Aborting...”
Završi algoritam /* obavezan prekid programa! */
novi.x = x
novi.sljedeci = NULL
Ako je Is_empty( ) onda prvi = zadnji = novi
U suprotnom
zadnji.sljedeci = novi
zadnji = novi
Izvedba funkcije Pop( )
(povezana lista)
Algoritam funkcije Pop( )
Ako je Is_empty( ) onda
Ispiši “Illegal POP. Aborting...”
Završi algoritam /* obavezan prekid programa! */
x = prvi.x
zabrisanje = prvi
prvi = prvi.sljedeći
Ako je prvi = NULL onda zadnji = NULL
oslobodi memoriju dinamički na adresi zabrisanje
Vratiti x
Izvedba funkcije Is_empty( )
(povezana lista)

Algoritam funkcije Is_empty( )


Ako je prvi=NULL i zadnji=NULL onda
Vratiti TRUE
Vratiti FALSE
Izvedba procedure Clear( )
(povezana lista)
Algoritam procedure Clear( ) InitializeQueue( )
prvi=NULL
zadnji=NULL
Brza, ali ostavlja ‘smeće’ u memoriji!
Algoritam procedure Clear( )
Sve dok nije Is_Empty( ) činiti
Pop( )

Ima linearnu složenost, ali ‘počisti’ zauzete zapise!


Ne radi dobro ako nema funkcije InitializeQueue( )
Algoritmi s redovima

Kao primjere algoritama s redovima mogu se


pokazati svi primjeri koje smo radili kada smo
govorili o stogovima.

Potrebno je napraviti manje preinake zbog FIFO


principa kod redova.

Redosljed obavljanja operacija u algoritmu će se


promijeniti ali će se dobiti isti rezultat!

You might also like