Fronta Fronta je sekvence first-in-first-out (první do fronty první z fronty) prvků. Prvky mohou být vkládány pouze nakonec (rear) fronty a odstraňovány pouze zpočátku (front) fronty Délka fronty je počet prvků, které obsahuje Prázdná fronta má délku nula. Animace - fronta osob BUS STOP Grafické znázornění předchozí animace: prvky Homer 1 Marge 2 Bart 3 Lisa Maggie přední zadní délka Použití fronty Print server (tiskový server) udržuje ve frontě požadavky na tisk Disk driver (ovladač disků) udržuje frontu I/O požadavků na disk
Fronta předpoklady předpoklady: 1) musí být možno vytvořit prázdnou frontu 2) musí být možné testovat zda lze vytvořit prázdnou frontu 3) musí být možné zjistit délku fronty ) musí být možné přidat na konec fronty ) musí být možné odstranit zpočátku fronty 6) musí být možný přístup k prvnímu prvku fronty bez možnosti jeho odstranění Implementace fronty pomocí pole berme v úvahu ohraničenou frontu jejíž délka<= maxdélka. Fronta je definována těmito proměnnými : délka rovná se aktuální délce fronty, přední označuje počátek fronty, zadní označuje konec fronty, pole prvků délky maxdélka obsahuje prvky ohraničené směrníky přední a zadní: Pole [ přední.. zadní 1 ] příklad fronty č.1 neobsazený přední zadní přední zadní 1 maxdélka 1 neobsazený speciální příklad fronty přední=zadní maxdélka 1 prázdná fronta
příklad k úvodní animaci (maxdélka = 6) Do příkladu fronty č.1 přidáme na konec fronty Ralpha: 1 2 Bart 3 Lisa Maggie Ralph přední 2 zadní délka Jestliže musíme přesouvat prvky polem operace APPEND a SERVE budou mít časovou složitost O(n). Abychom tomuto předešli používáme místo běžného pole cyklické. Cyklické pole V cyklickém poli a délky n, každý má i svého následovníka i svého předchůdce. Pak: 7 následovník a[n-1] je a[] předchůdce a[] je a[n-1] 6 1 grafické zobrazení cyklického pole: 2 3 1 2 3 6 7 Zkuste si představit pole, do něhož budeme ukládat hodnoty, jako proužek papíru rozdělený na jednotlivé buňky a na koncích slepený tak, že za posledním prvkem pole následuje opět první. Jednotlivé hodnoty pak budeme mít uložené v souvislé řadě kdekoliv v tomto poli, přičemž si budeme pamatovat pouze index, od kterého budeme prvky vybírat, a index, za který budeme prvky vkládat. Pokud by se stalo, že se oba indexy někde potkají, znamená to, že došlo k zaplnění celého pole.
Implementace fronty užitím cyklického pole berme v úvahu ohraničenou fronta jejíž délka<= maxdélka. Fronta je definována těmito proměnnými : délka rovná se aktuální délce fronty, přední označuje počátek fronty, zadní označuje konec fronty, pole prvků délky maxdélka obsahuje prvky ohraničené směrníky přední a zadní: 1.případ: pole [přední..zadní-1] 2.případ: pole [přední maxdélka-1] 3. případ: prvky [..zadní-1] přední zadní-1 maxdélka-1 1.případ zadní-1 přední maxdélka-1 2.případ přední=zadní maxdélka-1 3. případ - prázdná fronta
příklad k úvodní animaci (maxdélka=6) Po vyjmutí prvního prvku: prvky Nelson 1 Martin 2 3 Lisa Maggie Ralph přední 3 zadní 2 délka Fronta: operace operace, vyjádřené v prostředí DELPHI CREATE(Q) - vytvoří prázdnou frontu Q, EMPTY(S) - vrátí TRUE, je-li fronta prázdná, jinak vrátí FALSE, FRONT(Q) - vrátí první fronty Q, APPEND(x, Q) - vloží x na konec fronty Q, SERVE(Q) - vymaže první z Q, Podprogramy pro manipulaci s frontou: Deklarace pole const MAX = 2; type index = 1..MAX; Pole = array [index] of integer; var A : Pole; first, last: integer; Funkce CREATE - Vytvoří prázdnou frontu first:= 1; last := 1; Funkce EMPTY - zjistí zda je fronta prázdná (vrátí true / false): function EMPTY: boolean; if first=last then result:=true else result:=false;
Funkce APPEND přidá nový if last<>max then A[last]:=StrToInt(Edit1.Text); inc(last); Funkce SERVE odebere z fronty if first=max then first:=1; Button3Click(Sender); end else first:=first+1; Funkce Front vrátí první fronty Memo1.Lines.Clear; Memo1.Lines.Add(IntToStr(A[first])); ;