Laste ned presentasjonen
Presentasjon lastes. Vennligst vent
PublisertInga Didriksen Endret for 9 år siden
1
1 Kap 08 Kø
2
2 Kø - Definisjon En kø (eng queue) er en lineær struktur hvor elementer kan innsetttes kun i den ene enden av listen, kalt bak, og fjernes kun i den andre enden av listen, kalt foran. Kø: FIFO (First In First Out). To basis-operasjoner knyttet til kø: qAddInnsetting av element i en kø qRemoveFjerning av element fra en kø
3
3 Ikke-sirkulær kø - Eks Legg merke til at vi initielt har satt Foran = 1, til tross for at vi ikke har noen elementer i køen. Dette vil forenkle algoritmene noe.
4
4 Sirkulær kø - Eks Legg merke til den noe merkelige avslutningen med Foran = 5 og Bak = 4 til tross for at vi ikke har noen elementer i køen. g h
5
5 qAdd - Array-implementering Ikke-sirkulær kø qAdd (queue,post,bak,max,full) /*Rutinen plasserer en post (et element) i en kø */ /*queue:Køen som posten skal plasseres i*/ /*post:Posten som skal plasseres i køen*/ /*bak:Enden av køen*/ /*max:Maksimalt antall elementer i køen*/ /*full:Returnerer med vedien true*/ /*hvis køen er full*/ /*slik at post ikke kan plasseres*/ IF bak = max THEN full:= true ELSE full := false bak:= bak + 1 queue[bak]:= post ENDIF foran xxx bak
6
6 qRemove -Array-implementering Ikke-sirkulær kø qRemove (queue,post,foran,bak,tom) /*Rutinen plasserer en post (et element) i en kø */ /*queue:Køen som posten skal hentes/slettes fra*/ /*post:Posten som skal hentes/slettes i køen*/ /*foran:Fronten av køen*/ /*bak:Enden av køen*/ /*tom:Returnerer med vedien true*/ /*hvis køen er tom*/ /*slik at post ikke kan hentes/slettes*/ IF bak < foran THEN tom:= true ELSE tom := false post := queue[foran] foran := foran + 1 ENDIF foran xxx bak
7
7 Sirkulær kø - Modulus-funksjonen mod(a,b) = rest ved divisjon av heltall a med heltall b mod(5,2) = 1 mod(3,5) = 3 mod(a,b) skrives i Java og C++ som : a % b
8
8 Sirkulær kø - Test på tom kø Tom kø: mod(bak,max) + 1 = foran Dessverre viser det seg at den samme relasjonen også gjelder når køen er full. x x
9
9 Sirkulær kø - Tom kø / Full kø Foregående problem kan løses ved alltid å la minst en plass være ledig. Ett element i køen:foran = bak Tom kø:mod(bak,max) + 1 = foran Full kø:mod(mod(bak,max) + 1,max) + 1 = foran
10
10 qAdd - Array-implementering Sirkulær kø qAdd (queue,post,foran, bak,max,full) /*Rutinen plasserer en post (et element) i en sirkulær kø */ /*queue:Køen som posten skal plasseres i*/ /*post:Posten som skal plasseres i køen*/ /*foran:Fronten av køen*/ /*bak:Enden av køen*/ /*max:Maksimalt antall elementer i køen*/ /*full:Returnerer med vedien true*/ /*hvis køen er full*/ /*slik at post ikke kan plasseres*/ IF mod(mod(bak,max)+1,max)+1 = foran THEN full:= true ELSE full := false bak:= mod(bak,max) + 1 queue[bak]:=post ENDIF foran xxx bak
11
11 qRemove - Array-implementering Sirkulær kø qRemove (queue,post,foran,bak,tom) /*Rutinen plasserer en post (et element) i en sirkulær kø */ /*queue:Køen som posten skal hentes/slettes fra*/ /*post:Posten som skal hentes/slettes i køen*/ /*foran:Fronten av køen*/ /*bak:Enden av køen*/ /*tom:Returnerer med vedien true*/ /*hvis køen er tom*/ /*slik at post ikke kan hentes/slettes*/ IF mod(bak,max)+1 = foran THEN tom:= true ELSE tom := false post := queue[foran] foran := mod(foran,max) + 1 ENDIF foran xxx bak
12
12 qAdd - Lenket liste implementering qAdd (post,bak) /*Rutinen plasserer en post (et element) i en kø */ /*post:Posten som skal plasseres i køen*/ /*bak:Peker til enden av køen*/ p := new qNode p.data := post p.lenke := null bak.lenke := p bak := p foran DataLenke bak x
13
13 qRemove - Lenket liste implementering qRemove (post,foran,bak,tom) /*Rutinen plasserer en post (et element) i en kø impl som lenket liste*/ IF foran = bak THEN tom := true ELSE tom := false p := foran.lenke post := p.data foran.lenke := p.lenke IF bak = p THEN bak := foran ENDIF delete(p) ENDIF foran DataLenke x bak
14
14 Anvendelser - Tidsdeling Tidsdelingsssytem med bruk av felles ressurser. Prosess A er i øyeblikket under kjøring. A gjør forespørsel om bruk av printer. Tidsperiode for A løper ut under printing. A plasseres i en ready-queue (alle kjøreressurser er tilgjengelige for A) B overtar kjøringen. B gjør forespørsel om bruk av printer. B går inn i en blocked-queue inntil A er printet ferdig. readyQueue A blockedQueue B
15
15 Anvendelser - Prioritetskø Prioritetskø Hensiktsmessig med lenket liste implementering siden innsetting i en slik prioritetskø ikke nødvendigvis kan gjøres i enden av listen.
16
16 Klassehierarki - Kø QueueAsArray I_Queue QueueAsLinkedList Test I_ContainerA_Container I_ComparableA_Object
17
17 ENDEND
Liknende presentasjoner
© 2024 SlidePlayer.no Inc.
All rights reserved.