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]