Zásobník, fronta, seznam

Z FAV wiki
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(→Zásobník)
(→Zásobník)
Řádka 21: Řádka 21:
 
* '''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

Verze z 25. 8. 2011, 23:03

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


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:

Fronta

Fronta.jpg

ADT

Interface: operace Push, Pop, Front

= FIFO pamět

First: začátek fronty

Last: konec fronty

Implementace objektově:

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) 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


Seznam

Seznam.jpg

ADT

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

= 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.

Obousměrný seznam: 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)

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