Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

1 Kap 08 Kø. 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.

Liknende presentasjoner


Presentasjon om: "1 Kap 08 Kø. 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."— Utskrift av presentasjonen:

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


Laste ned ppt "1 Kap 08 Kø. 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."

Liknende presentasjoner


Annonser fra Google