130 likes | 219 Views
Zásobník a fronta. a) Zásobník. Zásobník ako aj fronta patria medzi dynamické dátové štruktúry . Zásobník je taký zoznam, v ktorom jeden jeho koniec(takzv. vrchol) slúži k pridávaniu a odoberaniu prvkov. Inde sa prvky nemôžu pridávať ani odoberať. Ak chceme odobrať nejaký
E N D
Zásobník a fronta a) Zásobník
Zásobník ako aj fronta patria medzi dynamické dátové štruktúry. Zásobník je taký zoznam, v ktorom jeden jeho koniec(takzv. vrchol) slúži k pridávaniu a odoberaniu prvkov. Inde sa prvky nemôžu pridávať ani odoberať. Ak chceme odobrať nejaký prvok, bude to ten , ktorý sme vložili posledný, preto býva zásobník označovaný ako Štruktúra typu LIFO (Last in, first out).Pozri obr. DNO VRCHOL
Zásobník sa používa napríklad pri riešení úloh typu „rozdeľ a panuj“, k odložení informácií, ktoré dielčie úlohy treba ešte vykonať, pri zpracovávaní aritmetických výrazov. Techniku zásobníku využíva i samotný mechanizmus volania procedúr a funkcií (rekurzia). Zásobník sa používa i vtedy , ak potrebujeme dočasne uložiť nejaké dáta a neskôr ich priebežne spracovávať. Zásobník sa dá programovať aj pomocou poľa:
Príklad 1.Zásobník celých čísel s kapacitou pre uloženie najviac 100 čísel. Const Maxzas =100; Type TypeZas = record Zasobnik: array [1..MaxZas] of integer; Vrchol : 0 .. MaxZas;
Inicializácia prázdneho zásobníku Procedure InicZasob(var Z : TypZas); Begin Z.Vrchol: = 0 End;
Pridanie jedného čísla do zásobníka Procedure VlozZasob( var Z:TypZas; X : integer); Begin with Z do begin if Vrchol = MaxZas then Error( Zaplneny) else begin Vrchol:=Vrchol +1; Zasobnik[Vrchol] := X end; end; End;
Odobratie jedného čísla zo zásobníka Function VezmiZasob(Var Z :TypZas): integer; Begin with Z do begin if vrchol = 0 then Error (zasobnik je prazdny) else begin VezmiZasob : = Zasobnik[vrchol] Vrchol:=vrchol –1; end end End;
b) Fronta Je zoznam , v ktorom sa pracuje s dátami spôsobom, ktorý sa podobá čakaniu ľudí vo fronte v bežnom živote. Prichádzajúci sa radia za sebou, kto skôr prišiel, bude skôr obslúžení a odíde. Preto býva fronta označovaná ako FIFO (first in, first out), viď schéma: príchod odchod
Fronta sa používa vtedy, pokiaľ potrebujeme dočasne odložiť nejaké dáta a zachovať pre ďalšie spracovanie ich pôvodné poradie. Frontu môžeme naprogramovať pomocou poľa, pokiaľ poznáme horný odhad jej maximálne možnej dĺžky. Budeme potrebovať dve celočíselné premenné, ktoré budú udávať indexy tých prvkov poľa, kde je uložený prvý prvok a posledný prvok fronty.
Príklad.Fronta celých čísel s kapacitou pre uloženie najviac 100 čísel. Const MaxFr= 100; Type TypFr = record Fronta: array [1..MaxFr] of integer; Zac, Kon: 1..MaxFr; {index prveho a posledneho} Pocet: 0.. MaxFr; { pocet prvkov vo fronte} end;
Inicializácia prázdnej fronty Procedure Inicfronta(var F: TypFr); Begin With F do begin Pocet := 0; Zac := 1; Kon:=MaxFr; end End;
Pridanie jedného čísla do fronty Procedure VlozFronta (var F TypFr; X : integer); Begin With F do begin if pocet = MaxFr then Error else begin if Kon = MaxFr then Kon:=1 else Kon:= Kon +1 {novy koniec fronty} Fronta[kon]:= X; inc(pocet); end; end ; End;
Odobratie jedného čísla z fronty Function VezmiFronta(var F: TypFr): integer; Begin With F do begin if Pocet = 0 then error else begin VezmiFronta :=Fronta[zac]; if Zac = MaxFr then zac:= 1; else zac:=zac +1 ;{novy zaciatok} pocet := pocet –1 ; end end End;