Zásobník, fronta, seznam

Z FAV wiki
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(→Zásobník)
(→Fronta)
 
(Není zobrazeno 9 mezilehlých verzí od 2 uživatelů.)
Řádka 8: Řádka 8:
 
* '''Pop''' vybírá nejpozději  vložená data
 
* '''Pop''' vybírá nejpozději  vložená data
 
* '''Peek''' vrátí nejpozději vložená data bez výběru prvku ze struktury
 
* '''Peek''' vrátí nejpozději vložená data bez výběru prvku ze struktury
−
= LIFO pamět
+
= LIFO pamět (Last In First Out)
 
   
 
   
 
Všechny operace jsou O(1)
 
Všechny operace jsou O(1)
Řádka 15: Řádka 15:
 
   
 
   
 
Head: vrchol zásobníku
 
Head: vrchol zásobníku
 +
  
 
Implementace objektově:  
 
Implementace objektově:  
Řádka 21: Řádka 22:
 
* '''Modifikátor:''' Push vytvoří pro data nový prvek, který ukazuje na prvek Head (Head bude předchozí), a změní ukazatel Head na vytvořený prvek
 
* '''Modifikátor:''' Push vytvoří pro data nový prvek, který ukazuje na prvek Head (Head bude předchozí), a změní ukazatel Head na vytvořený prvek
 
* '''Selektor:''' Peek vrátí data prvku Head, pokud Head != null. Pop vrátí stejná data jako Peek, ale před návratem změní ukazatel Head na předchozí prvek (Head = Head.Previous)
 
* '''Selektor:''' Peek vrátí data prvku Head, pokud Head != null. Pop vrátí stejná data jako Peek, ale před návratem změní ukazatel Head na předchozí prvek (Head = Head.Previous)
 +
  
 
Implementace na poli:
 
Implementace na poli:
−
* Máme pode typu stejného jako data
+
* Máme pole typu stejného jako data
 
* '''Konstruktor:''' Alokace pole a indexu Head, nastavení Head na -1
 
* '''Konstruktor:''' Alokace pole a indexu Head, nastavení Head na -1
 
* '''Modifikátor:''' Push zvýší index Head o 1 a zapíše data do pole na tento index. Pokud je index mimo pole, zvětšení pole (např. 2x), a po té zápis
 
* '''Modifikátor:''' Push zvýší index Head o 1 a zapíše data do pole na tento index. Pokud je index mimo pole, zvětšení pole (např. 2x), a po té zápis
Řádka 30: Řádka 32:
 
== Fronta ==
 
== Fronta ==
  
 +
Interface: operace Push, Pop, Front
 +
* '''Enqueue''' vkládá data do fronty za sebe
 +
* '''Dequeue''' vybírá nejdříve vložená data
 +
* '''Front''' vrátí nejdříve vložená data bez výběru prvku ze struktury
 +
= FIFO pamět (First In First Out)
 +
 
[[Soubor:Fronta.jpg]]
 
[[Soubor:Fronta.jpg]]
  
−
ADT
+
First: začátek fronty; Last: konec fronty
−
 
+
−
Interface: operace Push, Pop, Front
+
−
* '''Push''' vkládá data do fronty za sebe
+
−
* '''Pop''' vybírá nejdříve vložená data
+
−
* '''Peek''' vrátí nejdříve vložená data bez výběru prvku ze struktury
+
−
= FIFO pamět
+
−
+
−
'''First:''' začátek fronty
+
  
−
'''Last:''' konec fronty
 
  
 
Implementace objektově:  
 
Implementace objektově:  
Řádka 48: Řádka 47:
 
* '''Konstruktor:''' Vytvoříme pouze ukazatele First a Last, ukazující na null.
 
* '''Konstruktor:''' Vytvoříme pouze ukazatele First a Last, ukazující na null.
 
* '''Modifikátor:''' Push vytvoří pro data nový prvek, upraví prvek Last (pokud != null) tak, aby ukazoval na tento prvek, a změní ukazatel Last na tento prvek. Je-li ukazatel First nastaven na null, nastaví tento také na vytvořený prvek.
 
* '''Modifikátor:''' Push vytvoří pro data nový prvek, upraví prvek Last (pokud != null) tak, aby ukazoval na tento prvek, a změní ukazatel Last na tento prvek. Je-li ukazatel First nastaven na null, nastaví tento také na vytvořený prvek.
−
* '''Selektor:''' Front vrátí data prvku First, pokud First != null. Pop vrátí stejná data jako Peek, ale před návratem změní ukazatel First na následující prvek, pokud First != null (First = First.Next)
+
* '''Selektor:''' Front vrátí data prvku First, pokud First != null. Pop vrátí stejná data jako Front, ale před návratem změní ukazatel First na následující prvek, pokud First != null (First = First.Next)
 +
 
  
 
Implementace na poli (cyklicky):
 
Implementace na poli (cyklicky):
−
Máme podle typu stejného jako data a indexy First a Last. Indexy neukazují přímo do pole, nýbrž je proveden přepočet (Index mod Delka pole)
+
Máme pole typu stejného jako data a indexy First a Last. Indexy neukazují přímo do pole, nýbrž je proveden přepočet (Index mod Delka pole)
 
abychom využili celé pole. Tato fronta má omezenou délku.
 
abychom využili celé pole. Tato fronta má omezenou délku.
 
* '''Konstruktor:''' Alokace pole a indexů, nastavení Last na -1 a First na -1
 
* '''Konstruktor:''' Alokace pole a indexů, nastavení Last na -1 a First na -1
 
* '''Modifikátor:''' Pokud ((Last + 1) mod Delka) != (First mod Delka), Push provede Last++ a zapíše data do pole na tento index, jinak chyba (plná fronta). Pokud First = -1, pak First = 0 (první prvek).
 
* '''Modifikátor:''' Pokud ((Last + 1) mod Delka) != (First mod Delka), Push provede Last++ a zapíše data do pole na tento index, jinak chyba (plná fronta). Pokud First = -1, pak First = 0 (první prvek).
−
* '''Selektor:''' Peek vrátí prvek pole pod indexem First, pokud First <= Last. Pop jako peek, ale před návratem provede First++.
+
* '''Selektor:''' Front vrátí prvek pole pod indexem First, pokud First <= Last. Pop jako Front, ale před návratem provede First++.
  
 
Speciálním případem je například prioritní fronta, která řadí prvky ve frontě podle priority
 
Speciálním případem je například prioritní fronta, která řadí prvky ve frontě podle priority
−
 
  
 
== Seznam ==
 
== Seznam ==
 
   
 
   
 +
Interface - Iterator nad seznamem: Add, Remove, Get; First, Next, IsLast, případně další (Previous, Last, IndexOf, ...)
  
 
[[Soubor:Seznam.jpg]]
 
[[Soubor:Seznam.jpg]]
  
−
ADT
 
−
 
−
Interface - Iterator nad seznamem: Add, Remove, Get; First, Next, IsLast, případně další (Previous, Last, IndexOf, ...)
 
 
* '''Add''' vkládá data na pozici iterátoru. Složitost dle implementace.
 
* '''Add''' vkládá data na pozici iterátoru. Složitost dle implementace.
 
* '''Remove''' maže data na pozici iterátoru
 
* '''Remove''' maže data na pozici iterátoru
Řádka 89: Řádka 86:
 
Remove je opačný proces, Get vrátí data (Tedy Iterator.Next.Data), První prvek seznamu si uložíme, abychom se mohli rychle vracet, stejně jako poslední prvek. Next provede Iterator.Next = Iterator.Next.Next. Kontrolujeme, zda nejsme mimo seznam.
 
Remove je opačný proces, Get vrátí data (Tedy Iterator.Next.Data), První prvek seznamu si uložíme, abychom se mohli rychle vracet, stejně jako poslední prvek. Next provede Iterator.Next = Iterator.Next.Next. Kontrolujeme, zda nejsme mimo seznam.
  
−
Obousměrný seznam:
+
* Obousměrný seznam: Prvky mají i ukazatele na předchozí prvky, a je tedy možné se po nich pohybovat na obě strany.
−
Prvky mají i ukazatele na předchozí prvky, a je tedy možné se po nich pohybovat na obě strany.
+
* Kruhový seznam: Poslední prvek neukazuje na null, ale na první prvek. Tyto seznamy jsou použitelné ve speciálních případech (například nastavení segmentů sedmisegmentovky pro digitální hodiny)
−
 
+
−
Kruhový seznam:
+
−
Poslední prvek neukazuje na null, ale na první prvek. Tyto seznamy jsou použitelné ve speciálních případech (například nastavení segmentů sedmisegmentovky pro digitální hodiny)
+
  
 
Implementace na poli (nástřel):
 
Implementace na poli (nástřel):
Řádka 99: Řádka 93:
  
 
{{fav-kiv-bzinf}}
 
{{fav-kiv-bzinf}}
 +
[[Kategorie:fav-kiv-bzinf]]

Aktuální verze z 8. 6. 2016, 20:26

Všechny tyto ADT implementují IsEmpty (prázdná struktura) a Size (pošet prvků ve struktuře)


[editovat] Zásobník

Interface: operace Push, Pop, Peek

= LIFO pamět (Last In First Out)

Všechny operace jsou O(1)

Zasobnik.jpg

Head: vrchol zásobníku


Implementace objektově:


Implementace na poli:

[editovat] Fronta

Interface: operace Push, Pop, Front

= FIFO pamět (First In First Out)

Fronta.jpg

First: začátek fronty; Last: konec fronty


Implementace objektově:


Implementace na poli (cyklicky): Máme pole typu stejného jako data a indexy First a Last. Indexy neukazují přímo do pole, nýbrž je proveden přepočet (Index mod Delka pole) abychom využili celé pole. Tato fronta má omezenou délku.

Speciálním případem je například prioritní fronta, která řadí prvky ve frontě podle priority

[editovat] Seznam

Interface - Iterator nad seznamem: Add, Remove, Get; First, Next, IsLast, případně další (Previous, Last, IndexOf, ...)

Seznam.jpg

= struktura, do které je možné libovolně zapisovat a číst (na libovolné pozici)

Iterator: ukazatel do struktury

Implementace objektově - nástřel:

Zasovnik-fronta-seznam-objektove.jpg

Prvky ukazují na následující prvky seznamu. Iterátor je dobré implementovat tak, že ve skutečnosti ukazuje na předchozí prvek (Pokud tedy seznam není obousměrný, pak máme metodu Previous a je to jedno). Metoda add vloží prvek za prvek, na který ukazuje iterátor tak, že pouze upraví ukazatele prvků:

Remove je opačný proces, Get vrátí data (Tedy Iterator.Next.Data), První prvek seznamu si uložíme, abychom se mohli rychle vracet, stejně jako poslední prvek. Next provede Iterator.Next = Iterator.Next.Next. Kontrolujeme, zda nejsme mimo seznam.

Implementace na poli (nástřel): Pole má nevýhodu, že je nutné přesunout prvky doprava od iterétoru, pokud vkládáme prvky. Při mazání lze prvky posunout doleva, nebo do pole uložit hodnotu, která se zcela jistě nebude v poli nebude vyskytovat, nebo vytvořit stínové pole, ve kterém si smazané prvky označíme, a při posunu iterátoru je poté vynecháme. Tento přístup je dobrý pokud pole často upravujeme.


Osobní nástroje
Jmenné prostory
Varianty
Akce
Navigace
Nástroje