170 likes | 328 Views
Kap 08 Kø. 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ø:
E N D
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ø: qAdd Innsetting av element i en kø qRemove Fjerning av element fra en kø
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.
Sirkulær kø - Eks g h 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.
qAdd - Array-implementering Ikke-sirkulær kø x x x foran bak 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
qRemove - Array-implementering Ikke-sirkulær kø x x x foran bak 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
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
Sirkulær kø - Test på tom kø Tom kø: mod(bak,max) + 1 = foran x Dessverre viser det seg at den samme relasjonen også gjelder når køen er full. x
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
qAdd - Array-implementering Sirkulær kø x x x foran bak 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
qRemove - Array-implementering Sirkulær kø x x x foran bak 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
qAdd - Lenket liste implementering foran bak Data Lenke x 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
qRemove - Lenket liste implementering foran bak Data Lenke x 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
Anvendelser - Tidsdeling Tidsdelingsssytem med bruk av felles ressurser. readyQueue A B blockedQueue 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.
Anvendelser - Prioritetskø Prioritetskø Hensiktsmessig med lenket liste implementering siden innsetting i en slik prioritetskø ikke nødvendigvis kan gjøres i enden av listen.
Klassehierarki - Kø I_Comparable A_Object I_Container A_Container QueueAsArray I_Queue Test QueueAsLinkedList Test