6. Rad
6.1 Čo je to?
Rad (front, queue) je taký lineárny zoznam, na ktorom sú definované iba tieto operácie:
- vytvoriť prázdny rad
- pridať nový prvok na koniec radu
- odobrať prvok zo začiatku radu
- zistiť, či je rad prázdny
Operácia "vlož prvok do frontu" sa niekedy v literatúre označuje enter. Operácia "vyber prvok z frontu" sa nazýva remove.
Rad sa v praxi spravidla implementuje ako lineárny
zoznam. Implementácia pomocou poľa je síce možná, ale veľmi nevýhodná.
Operácia odober zo začiatku si vyžaduje posun ostatných prvkov o jedno
miesto vľavo. V prípade, že nechceme pole posúvať, môžeme si síce
pamätať index prvku, ktorý je na začiatku a index prvku na konci
frontu, ale prvky, ktoré sa už z frontu "odstránili", sú zbytočne stále
uložené v poli. Navyše by sme museli veľkosť frontu vopred vymedziť
veľkosťou použitého poľa.
Graficky sa front implementovaný ako jednosmerný lineárny zoznam znázorňuje väčšinou takto: | h1,h2, h3, ..., hn sú hodnoty prvkov vo fronte
pointer z ukazuje na začiatok frontu pointer k ukazuje na koniec frontu
|
| Princíp, podľa ktorého sa najskôr vložený prvok odstráni z radu ako prvý, sa nazýva princíp FIFO (z angl. First In First Out - "prvý príde, prvý odíde").
Rad sa preto nazýva aj pamäť FIFO.
| |
|
V programoch
sa často používajú niektoré špeciálne druhy radov, ktoré sa správajú
trochu inak. Medzi najpoužívanejšie patrí
dvojitý front - ktorý umožňuje pridávať a odoberať prvky z
oboch koncov (analógia bežného radu zo života - na začiatok prichádzajú
prominenti, koniec opúšťajú tí, ktorí už nemôžu čakať)
front s predbiehaním do ktorého sa nový prvok zaraďuje podľa priority (dôležitosti)
Precvičme si
Napíšte program, ktorý bude simulovať činnosť "operačného systému"
tlačiarne. Prichádzajúce úlohy sa budú zaraďovať do dvoch frontov.
Jeden z nich je prioritný - kým v ňom budú nejaké úlohy, budú sa
tlačiť tie a všetko ostatné bude čakať. Druhý, bežný front, sa
bude spracúvať len v prípade, ak bude prvý prázdny. Kvôli
zjednodušeniu nahradíme skutočnú tlač výpisom názvu úlohy na obrazovku,
pridávanie úloh do frontov a spustenie vybavovania úloh bude možné
vykonať výberom príslušnej ponuky z menu na obrazovke.
|
[Riešenie]
|
|