Většina začátečníků předpokládá, že datové struktury jsou statické. To je špatně. Související zásobník je dynamická entita. Při letu roste a smršťuje se. Paměť předem nepřidělujete. Dostanete to, když to potřebujete. Uvolníš, až budeš hotový.
Tento příklad používá celá čísla. Pokud chcete, změňte typedef int stack_data na float nebo char. Logika zůstane stejná.
Rozhraní
Podívejte se na soubor záhlaví. Toto je smlouva.
stack_init nastaví strukturu. stack_clear to vymaže. stack_empty říká, zda tam něco zůstalo. push vloží data dovnitř. pop je načte.
Jen. Čistě.
Motor
Zdrojový soubor skrývá vnitřní náplň.
top označuje nejnovější prvek. “NULL” znamená prázdné.
stack_init jednoduše resetuje top na NULL. Připraveno.
stack_clear zobrazuje prvky, dokud není zásobník prázdný. Je to koloběh. Je to levné.
stack_empty kontroluje, zda top je NULL. Vrátí 1, pokud je pravda. 0, pokud je nepravda.
stack_push udělá většinu práce.
Přiděluje paměť. Nastaví data. Spojuje je se starým vrcholem. Aktualizace top.
stack_pop spustí proces v obráceném pořadí.
Bere data. Přesune se „nahoru“ dolů. Uvolní starý uzel. Vrátí hodnotu.
Co když je zásobník prázdný? Vrátí odpadky. Nevytahujte data z prázdného zásobníku.
Skrytí informací
Toto je klíčový bod.
Vidíte pouze hlavičkový soubor. Nevidíte implementační kód.
Zásobník může používat pole. Ukazatele. Soubory. Propojený seznam. Na tom nezáleží.
Dokud rozhraní funguje, je vám jedno, jak je navrženo.
Toto je skrývání informací. Není to jen módní slovo. Takto vytvoříte software, který se nerozbije, když se změní interní implementace.
Funkce C
C je neúprosný.
- Závorky mají význam.
(*p).inení totéž jako*p.i. V prvním případě se nejprve dereferencuje ukazatel. Ve druhém nejprve zpřístupněte člena a poté dereference. Pokud uděláte chybu, dostanete neúspěch. - Netěsnosti paměti. Nikdy nepřiřazujte pouze
top = NULL. Ztratíte všechny uzly v seznamu. Ztratíte data. Ztratíte paměť. Použijte „zdarma“. Vždy. - Zahrňte soubory záhlaví.
NULLje vstdio.h. Pokud jej zapomenete zahrnout, váš kód se nemusí na některých kompilátorech zkompilovat. Ale ne na ostatních. Nebo bude podivným způsobem definovatNULLjako nulu. Pokud používáte ukazatele, zahrňte.
Co bude dál?
Základní zásobník je jednoduchý. Skutečné stacky vyžadují více.
Přidejte dup. Duplikujte horní prvek. Přidejte „počet“. Vraťte počet prvků. Přidejte „přidat“. Vyjměte horní dva prvky, složte je a výsledek vložte zpět.
Napište program ovladače. Napište Makefile. Kompilovat. Spusťte to.
Pokud dojde k chybě, zmeškali jste „zdarma“. Nebo jste otevřeli uvolněnou paměť. Ladit.
Skutečné hodnocení
Dynamická alokace paměti je rychlá. Dokud to nebude jinak.
malloc a free mají režii. V úzkých cyklech se to hromadí.
Ale pro všeobecné použití? Je flexibilní. To je standardní. To je to, co uvidíte ve většině kódových bází C.
Související zásobník je stavebním kamenem.
Budete jej používat k volání funkcí. K vyhodnocení výrazů. Pro tlačítka “Storno”.
Je všude.
Pamatujte: pokud přidělíte paměť, musíte ji uvolnit. Jinak.
“Kód je jako humor”


























