<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.multimediaexpo.cz/mmecz/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Z%C3%A1sobn%C3%ADk_%28datov%C3%A1_struktura%29</id>
		<title>Zásobník (datová struktura) - Historie editací</title>
		<link rel="self" type="application/atom+xml" href="http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Z%C3%A1sobn%C3%ADk_%28datov%C3%A1_struktura%29"/>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Z%C3%A1sobn%C3%ADk_(datov%C3%A1_struktura)&amp;action=history"/>
		<updated>2026-05-03T13:16:27Z</updated>
		<subtitle>Historie editací této stránky</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Z%C3%A1sobn%C3%ADk_(datov%C3%A1_struktura)&amp;diff=2422397&amp;oldid=prev</id>
		<title>Sysop: /* Stack a programovací jazyky */</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Z%C3%A1sobn%C3%ADk_(datov%C3%A1_struktura)&amp;diff=2422397&amp;oldid=prev"/>
				<updated>2022-11-03T11:49:39Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Stack a programovací jazyky&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Starší verze&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Verze z 3. 11. 2022, 11:49&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Řádka 144:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Řádka 144:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Některé jazyky jako [[Lisp]] a [[Python]] nepotřebují implementace zásobníku, protože funkce '''push''' a '''pop''' jsou dostupné ke každému seznamu. Všechny [[Forth]]u podobné jazyky (např. [[PostScript|Adobe PostScript]] jsou navrženy okolo zásobníku, který je viditelný a přístupný programátorovi.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Některé jazyky jako [[Lisp]] a [[Python]] nepotřebují implementace zásobníku, protože funkce '''push''' a '''pop''' jsou dostupné ke každému seznamu. Všechny [[Forth]]u podobné jazyky (např. [[PostScript|Adobe PostScript]] jsou navrženy okolo zásobníku, který je viditelný a přístupný programátorovi.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[C++]] a jeho [[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;:en:&lt;/del&gt;Standard Template Library]] poskytují &amp;quot;&amp;lt;code&amp;gt;stack&amp;lt;/code&amp;gt;&amp;quot; šablonu tříd, které jsou omezeny jenom na '''push''' a '''pop''' operace. Java obsahuje třídu [http://java.sun.com/javase/6/docs/api/java/util/Stack.html stack], která je odvozena od třídy [http://java.sun.com/javase/6/docs/api/java/util/Vector.html Vector], což může být považováno za chybu návrhu, protože zděděná metoda get() ignoruje [[LIFO]] model zásobníku.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[C++]] a jeho [[Standard Template Library]] poskytují &amp;quot;&amp;lt;code&amp;gt;stack&amp;lt;/code&amp;gt;&amp;quot; šablonu tříd, které jsou omezeny jenom na '''push''' a '''pop''' operace. Java obsahuje třídu [http://java.sun.com/javase/6/docs/api/java/util/Stack.html stack], která je odvozena od třídy [http://java.sun.com/javase/6/docs/api/java/util/Vector.html Vector], což může být považováno za chybu návrhu, protože zděděná metoda get() ignoruje [[LIFO]] model zásobníku.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Podobné datové struktury ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Podobné datové struktury ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Z%C3%A1sobn%C3%ADk_(datov%C3%A1_struktura)&amp;diff=153665&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Z%C3%A1sobn%C3%ADk_(datov%C3%A1_struktura)&amp;diff=153665&amp;oldid=prev"/>
				<updated>2013-06-16T12:40:08Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Starší verze&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Verze z 16. 6. 2013, 12:40&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Z%C3%A1sobn%C3%ADk_(datov%C3%A1_struktura)&amp;diff=153664&amp;oldid=prev</id>
		<title>Sysop: + Nový článek...jen díky přerušenému přesměrování</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Z%C3%A1sobn%C3%ADk_(datov%C3%A1_struktura)&amp;diff=153664&amp;oldid=prev"/>
				<updated>2012-09-03T21:57:12Z</updated>
		
		<summary type="html">&lt;p&gt;+ Nový článek...jen díky přerušenému přesměrování&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Soubor:Data stack.png|thumb|220px|right|Princip zásobníku]]&lt;br /&gt;
'''Zásobník''' je v [[Informatika (počítačová věda)|informatice]] obecná datová struktura (tzv. [[abstraktní datový typ]]) používaná pro dočasné ukládání dat. Také se používá anglický výraz '''stack'''.&lt;br /&gt;
&lt;br /&gt;
Pro '''zásobník''' je charakteristický způsob manipulace s daty - data uložena jako poslední budou čtena jako první. Proto se používá také výraz ''LIFO'' z anglického „''Last In – First Out''“. (Srovnej s [[FIFO]]).&lt;br /&gt;
&lt;br /&gt;
Pro manipulaci s uloženými datovými položkami se udržuje tzv. ''ukazatel zásobníku'', který udává relativní adresu poslední přidané položky, tzv. ''vrchol zásobníku''.&lt;br /&gt;
&lt;br /&gt;
Obsahem zásobníku mohou být jakékoli datové struktury. Může být realizován jak programovými prostředky, tak i elektronickými obvody. &lt;br /&gt;
&lt;br /&gt;
Nejznámější aplikací zásobníku je [[zásobník volání|vnitřní zásobník]] realizovaný [[procesor]]em, do něhož jsou ukládány návratové adresy a příznaky stavu procesoru při přerušeních a skocích do podprogramů. Při návratu z podprogramu je z vrcholu zásobníku vyjmuta návratová adresa a zpracování pokračuje od přerušeného místa. Tento zásobník může být čistě v procesoru, nebo se fyzicky nachází v paměti a procesor obsahuje pouze podporu jeho používání. Ve většině případů (včetně procesorů architektury [[IA-32|i386]]) je možné na zásobník v paměti s podporou procesoru ukládat libovolné informace, což se využívá především k ukládání parametrů funkcí a jejich lokálních proměnných.&lt;br /&gt;
&lt;br /&gt;
Zásobník, ať už [[hardware|hardwarový]] nebo [[software|softwarový]] (emulovaný) je klíčovou datovou strukturou používanou v [[programování]] při realizaci [[rekurze|rekurzivních]] [[algoritmus|algoritmů]].&lt;br /&gt;
&lt;br /&gt;
== Historie ==&lt;br /&gt;
Zásobník byl poprvé vytvořen v roce 1955, načež byl v roce 1957 patentován Němcem [[Friedrich L. Bauer|Friedrichem L. Bauerem]]. Stejný koncept byl nezávisle a v přibližně stejném čase vyvinut Australanem [[Charles Leonard Hamblin|Charlesem L. Hamblinem]].&lt;br /&gt;
&lt;br /&gt;
== Zásobníková architektura ==&lt;br /&gt;
&lt;br /&gt;
Jako počítače nebo [[virtuální stroj]]e se zásobníkovou architekturou se označují takové, které používají zásobník jako základní strukturu pro ukládání mezivýsledků výpočtu. Často nemají žádné nebo jen minimum [[Registr procesoru|registr]]ů a omezený přístup k paměti. Aby byly [[Turing-kompletní]], musí buď mít přece jen nějaký přístup k paměti, nebo musí mít zásobníky dva.&lt;br /&gt;
&lt;br /&gt;
Příklady virtuálních strojů se zásobníkovou architekturou:&lt;br /&gt;
&lt;br /&gt;
* [[Java (programovací jazyk)|Java]]&lt;br /&gt;
* [[Lisp]]&lt;br /&gt;
* [[PostScript]] – jazyk pro popis stránky&lt;br /&gt;
&lt;br /&gt;
== Minimální implementace zásobníku ==&lt;br /&gt;
&lt;br /&gt;
Pro implementaci zásobníku jako abstraktního [[datový typ|datového typu]] jsou zapotřebí tato primitiva:&lt;br /&gt;
&lt;br /&gt;
* inicializace zásobníku ('''create''') - může proběhnout v rámci funkce '''push'''&lt;br /&gt;
* přidání položky na vrchol zásobníku ('''push''')&lt;br /&gt;
* odebrání položky z vrcholu zásobníku ('''pop''' nebo '''pull''')&lt;br /&gt;
* dotaz na vrchol zásobníku ('''top''')&lt;br /&gt;
* dotaz na prázdnost zásobníku ('''is_empty''') – může se také detekovat v rámci funkce '''pull'''&lt;br /&gt;
&lt;br /&gt;
== Softwarová implementace zásobníku ==&lt;br /&gt;
=== Implementace ===&lt;br /&gt;
Ve většině vyšších programovacích jazyků může být zásobník poměrně jednoduše implementován pomocí [[Pole (datová struktura)|pole]], nebo [[Lineární seznam|lineárního seznamu]]. To co identifikuje datovou strukturu jako zásobník není implementace, ale [[Rozhraní (informatika)|rozhraní]] - uživatel smí pouze přidávat (push) nebo ubírat (pop) hodnoty z pole či lineárního seznamu spolu s několika málo pomocnými funkcemi. Následující text demonstruje toto pravidlo pomocí jazyka [[C (programovací jazyk)|C]].&lt;br /&gt;
&lt;br /&gt;
==== Pole ====&lt;br /&gt;
Implementace pomocí '''pole''' se zaměřuje na vytvoření pole, kde se na nulovém indexu (array[0]) nachází dno zásobníku. Program si do pomocné proměnné ukládá na jakém indexu se nachází vrchol zásobníku - tento index se mění podle toho jak velikost zásobníku roste, nebo se zmenšuje. V jazyce C může být tento zásobník implementován jako jednoduchá [[struktura (programování)|struktura]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    typedef struct{&lt;br /&gt;
        int top;&lt;br /&gt;
        int items[STACKSIZE];&lt;br /&gt;
    }STACK;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkce '''push()''' je použita k inicializaci zásobníku a zároveň přidání nové hodnoty na jeho vrchol. Je zodpovědná za změnu hodnoty proměnné '''&amp;lt;code&amp;gt;ps-&amp;gt;top&amp;lt;/code&amp;gt;''' a za vložení nového prvku do pole '''&amp;lt;code&amp;gt;ps-&amp;gt;items[]&amp;lt;/code&amp;gt;'''. Funkce také ověřuje jestli pole není plné; pokud by se pole naplnilo a tato kontrola by zde nebyla, vedlo by to k chybě [[segmantation fault]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    void push(int x, STACK *ps)&lt;br /&gt;
    {&lt;br /&gt;
        if(ps-&amp;gt;top == STACKSIZE-1){&lt;br /&gt;
            printf(&amp;quot;Error: stack overflow&amp;quot;);&lt;br /&gt;
            exit(EXIT_FAILURE);&lt;br /&gt;
        } else &lt;br /&gt;
            ps-&amp;gt;items[++(ps-&amp;gt;top)] = x;&lt;br /&gt;
            &lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkce '''pop()''' odstraňuje prvek z vrcholu zásobníku a [[Unární operace#Unární operace v programování|dekrementuje]] hodnotu '''&amp;lt;code&amp;gt;ps-&amp;gt;top&amp;lt;/code&amp;gt;'''. Dále ověřuje jestli zásobník není prázdný - pokud by zde tato kontrola nebyla, tak by pokus u vyjmutí prvku z již prázdného zásobníku pravděpodobně vedl k chybě segmentation fault.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    int pop(STACK *ps)&lt;br /&gt;
    {&lt;br /&gt;
        if(empty(ps)){&lt;br /&gt;
            printf(&amp;quot;Error: stack underflow&amp;quot;);&lt;br /&gt;
            exit(EXIT_FAILURE);&lt;br /&gt;
        } else &lt;br /&gt;
            return(ps-&amp;gt;items[(ps-&amp;gt;top)--]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lineární seznam ====&lt;br /&gt;
&lt;br /&gt;
Implementace pomocí '''lineárního seznamu''' je stejně jednoduchá a srozumitelná. Dalo by říct, že zásobníkový lineární seznam je o dost více jednodušší než ostatní obvyklé použití lineárního seznamu - požaduje pouze takovou implementaci kde může být přidán nebo odebrán pouze vrchní element. &lt;br /&gt;
&lt;br /&gt;
Na rozdíl od implementace pomocí pole tato struktura neodpovídá celému zásobníku, ale pouze jedinému elementu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    typedef struct stack{&lt;br /&gt;
        int data;&lt;br /&gt;
        struct stack *nxt;&lt;br /&gt;
    } STACK;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tato struktura odpovídá typickému prvku lineárního seznamu (minimálně v C).&lt;br /&gt;
&lt;br /&gt;
Funkce '''push()''' má za úkol inicializovat prázdný zásobník a přidat nový prvek k neprázdnému seznamu. Funguje tak, že jako parametr dostane nová data spolu s adresou cílového zásobníku, načež vytvoří nový prvek seznamu tím že mu alokuje paměť a pak ho vloží do seznamu jako nový vrchol:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    void push(int nw, STACK **hd)&lt;br /&gt;
    {&lt;br /&gt;
        STACK *node= (STACK*) malloc(sizeof(STACK));  /* vytvoř nový prvek */&lt;br /&gt;
                &lt;br /&gt;
        if (node == NULL){&lt;br /&gt;
            printf(&amp;quot;Error: no space available for node&amp;quot;);&lt;br /&gt;
            getchar();&lt;br /&gt;
            exit(EXIT_FAILURE);&lt;br /&gt;
        } else {                                      /* inicializuj prvek */&lt;br /&gt;
            node-&amp;gt;data = nw;                          &lt;br /&gt;
            node-&amp;gt;nxt = NULL;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        if(empty(*hd))                                /* inicializuj seznam */&lt;br /&gt;
            *hd = node;&lt;br /&gt;
        else {                                        /* vlož nový vrchol */&lt;br /&gt;
            node-&amp;gt;nxt = *hd;&lt;br /&gt;
            *hd = node;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funkce '''pop()''' odstraní vrchol zásobníku ze seznamu a přiřadí ukazatel na vrchol zásobníku předchozímu prvku. Ověřuje jestli seznam není prázdný před tím než z něj odebere prvek:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    int pop(STACK **hd)&lt;br /&gt;
    {&lt;br /&gt;
        int value;&lt;br /&gt;
        STACK *dummy;&lt;br /&gt;
    &lt;br /&gt;
        if(empty(*hd)) {                             /* zásobník je prázdný */     &lt;br /&gt;
           printf(&amp;quot;Stack is empty&amp;quot;);&lt;br /&gt;
           getchar();&lt;br /&gt;
        } else {                                     /* odeber prvek */&lt;br /&gt;
            value = (*hd)-&amp;gt;data;&lt;br /&gt;
            dummy = *hd;&lt;br /&gt;
            *hd = (*hd)-&amp;gt;nxt;&lt;br /&gt;
            free(dummy);&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        return value;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stack a programovací jazyky ===&lt;br /&gt;
Některé jazyky jako [[Lisp]] a [[Python]] nepotřebují implementace zásobníku, protože funkce '''push''' a '''pop''' jsou dostupné ke každému seznamu. Všechny [[Forth]]u podobné jazyky (např. [[PostScript|Adobe PostScript]] jsou navrženy okolo zásobníku, který je viditelný a přístupný programátorovi.&lt;br /&gt;
&lt;br /&gt;
[[C++]] a jeho [[:en:Standard Template Library]] poskytují &amp;quot;&amp;lt;code&amp;gt;stack&amp;lt;/code&amp;gt;&amp;quot; šablonu tříd, které jsou omezeny jenom na '''push''' a '''pop''' operace. Java obsahuje třídu [http://java.sun.com/javase/6/docs/api/java/util/Stack.html stack], která je odvozena od třídy [http://java.sun.com/javase/6/docs/api/java/util/Vector.html Vector], což může být považováno za chybu návrhu, protože zděděná metoda get() ignoruje [[LIFO]] model zásobníku.&lt;br /&gt;
&lt;br /&gt;
=== Podobné datové struktury ===&lt;br /&gt;
Funkcí se zásobníku podobá [[Fronta (datová struktura)|fronta]], která s ním může být zkombinovaná do [[deque|obousměrně ukončené fronty]]. Stručně řečeno, fronta je struktura typu [[FIFO]].&lt;br /&gt;
&lt;br /&gt;
== Hardwarová implementace zásobníku ==&lt;br /&gt;
Nejčastější použití zásobníku na úrovni hardwaru (architektury) je jako prostředek k alokování a přidělování paměti.&lt;br /&gt;
&lt;br /&gt;
=== Základní architektura zásobníku ===&lt;br /&gt;
[[Soubor:ProgramCallStack2.png|thumb|350px|right|Typická ukázka zásobníku rostoucího směrem dolu. Tento typ je používaný velice často, ale je náchylný k útokům pomocí [[přetečení na zásobníku]].]]&lt;br /&gt;
&lt;br /&gt;
Nejčastěji je zásobník část paměti počítače s pevně danou počáteční adresou a proměnnou velikostí. Na začátku je velikost stacku 0. ''Ukazatel velikosti zásobníku'' (nejčastěji registr) ukazuje na adresu začátku zásobníku.&lt;br /&gt;
&lt;br /&gt;
Dvě základní operace použitelné na jakýkoliv zásobník jsou:&lt;br /&gt;
* '''push'''&lt;br /&gt;
** data jsou přidána na adresu paměti, kterou ukazuje ''ukazatel velikosti zásobníku'' a adresa ukazatele je změněna o velikost paměti zabranou daty&lt;br /&gt;
* '''pop''' nebo '''pull'''&lt;br /&gt;
** data jsou vyjmuty z adresy na kterou ukazuje ''ukazatel velikosti zásobníku'' a jeho adresa je změněna o velikost paměti kterou na zásobníku zabíraly data &lt;br /&gt;
&lt;br /&gt;
Existuje několik variací základních operací nad zásobníkem. Každý zásobník má v paměti pevně danou pozici kde začíná. Jak jsou data přidávána, ''ukazatel zásobníku'' je měněn tak, aby ukazoval aktuální velikost zásobníku, která se mění směrem od počáteční adresy zásobníku (buď dolu, nebo nahoru v závislosti na implementaci).&lt;br /&gt;
&lt;br /&gt;
Například zásobník může začínat na adrese 1000 a expandovat směrem dolu, díky čemuž jsou nová data uchovávána na adrese 1000 a ''ukazatel velikosti zásobníku'' je dekrementován pokaždé, když je přidán nový prvek. Pokud je prvek ze zásobníku odebrán, ukazatel je inkrementován. Maximální možná adresa na kterou je možné uložit data je 0.&lt;br /&gt;
&lt;br /&gt;
''Ukazatel velikosti zásobníku'' může ukazovat na počáteční adresu zásobníku, nebo na omezený počet adres pod, nebo nad počáteční adresou (záleží na tom jestli roste nahoru, nebo dolu), ale nikdy nesmí ukazovat za tuto hranici. Jinak řečeno, pokud je počáteční adresa 1000 a zásobník roste dolu (nabírá hodnot 999, 998 atp..), ukazatel nikdy nesmí být inkrementován přes 1000 (1001, 1002 etc..). Pokud přílišné volání funkce '''pop''' způsobí změnu adresy nad tuto hodnotu, dochází k ''podtečení zásobníku''. Jestliže nastane příliš volání funkce '''push''' a ''ukazatel velikosti zásobníku'' bude ukazovat za minimální (nebo maximální v případě rostoucího zásobníku) adresu, dochází k ''[[přetečení zásobníku]]''.&lt;br /&gt;
&lt;br /&gt;
Některá prostředí, která opravdu závisí na zásobníku mohou nabízet dodatečné operace nad zásobníkem:&lt;br /&gt;
* '''Dup'''(likovat) &lt;br /&gt;
** vrchol zásobníku je vyjmut a vložen dvakrát, takže kopie vrcholu je nyní nejvýše s originálem pod sebou&lt;br /&gt;
* '''Peek'''&lt;br /&gt;
** vrchol je vrácen jako v případě pop, ale ''ukazatel velikosti zásobníku'' a velikost stacku zůstává nezměněna&lt;br /&gt;
** tato operace je často v literatuře nazývána též '''top'''&lt;br /&gt;
* '''Swap''' nebo '''Exchange'''&lt;br /&gt;
** vrchol zásobníku si prohodí místo s prvkem pod ním&lt;br /&gt;
* '''Rotate'''&lt;br /&gt;
** ''n'' nejvyšších prvků je přemístěno rotací (viz dál)&lt;br /&gt;
** existují dva základní způsoby rotace - ''rotace vlevo'' a ''rotace vpravo''&lt;br /&gt;
&lt;br /&gt;
Zásobník je často zobrazován jak roste směrem nahoru (viz obrázek na vrcholu stránky), nebo směrem zleva doprava, takže nejvyšší hodnota je hodnota nejvíce vpravo. Toto znázornění může být nezávislé na skutečné struktuře zásobníku v paměti. Rotace vpravo pak znamená, že prvek na prvním místě se přemístí na třetí místo, druhý na první a třetí na místo druhého. Zde je znázornění tohoto procesu;&lt;br /&gt;
&lt;br /&gt;
 jablko                        banán&lt;br /&gt;
 banán    → rotace vpravo →    okurka&lt;br /&gt;
 okurka                        jablko&lt;br /&gt;
&lt;br /&gt;
 okurka                        jablko&lt;br /&gt;
 banán     → rotace vlevo →    okurka &lt;br /&gt;
 jablko                        banán&lt;br /&gt;
&lt;br /&gt;
V počítači je zásobník obvykle reprezentován jako blok paměťových buněk s &amp;quot;dnem&amp;quot; na pevně dané adrese, přičemž ''ukazatel na vrchol'' ukazuje na momentálně nejvyšší zabranou buňku zásobníku (vrchol). Termíny ''vrchol'' a ''dno'' jsou používány bez ohledu na to, jestli zásobník roste v paměti nahoru (98, 99, 100 ..), nebo dolu (100, 99, 98 ..).&lt;br /&gt;
&lt;br /&gt;
=== Vrchol zásobníku ===&lt;br /&gt;
Vložením prvku na zásobník je ''ukazatel vrcholu'' změněn o velikost prvku (jestli je inkrementován nebo dekrementován záleží na tom kam zásobník v paměti roste), takže ukazuje na novou buňku paměti kam nakopíruje nový vrchol zásobníku.&lt;br /&gt;
&lt;br /&gt;
Při vkládání ('''push''') může ukazatel na konci operace ukazovat na vrchol zásobníku, nebo na následující volnou buňku. Pokud ukazuje na vrchol zásobníku, tak bude aktualizován před tím než bude na danou adresu vložen nový prvek. &lt;br /&gt;
&lt;br /&gt;
Vyjmutí ('''pop''') hodnoty ze zásobníku je jednoduše inverzní operace k vkládání. Prvek na vrcholu je odstraněn a ukazatel je aktualizován v opačném pořadí než jaké bylo použito při vkládání.&lt;br /&gt;
&lt;br /&gt;
=== Hardwarová podpora ===&lt;br /&gt;
==== Zásobník v hlavní paměti ====&lt;br /&gt;
Hodně CPU má registry, které mohou být použity jako ''ukazatele vrcholu''. Některé (např. [[x86|Intel x86]] a [[Z80|Zilog Z80]]) mají speciální instrukce, které implicitně používají registr který byl vyhrazený k použití pro ukazatel Ostatní (např. [[PDP-11|DEC PDP-11]] a řada [[Motorola]] 68000) mají módy adresování které umožňují použít jakýkoliv registr pro ukazatel. &lt;br /&gt;
&lt;br /&gt;
==== Zásobník v registru ====&lt;br /&gt;
Série numerických koprocesorů Intel 80x87 má řadu registrů které mohou být adresovány jako zásobník, nebo jako sada číselných registrů. Počítače Sun [[SPARC]] mají řadu [[Registrové okno|registrových oken]] organizovaných jako zásobník, takže podstatně redukují místo v paměti které zabírají argumenty funkcí a návratové hodnoty.&lt;br /&gt;
&lt;br /&gt;
==== Zásobník v oddělené paměti ====&lt;br /&gt;
Existuje řada [[Jednočipový počítač|mikroprocesorů]]. které implementují zásobník přímo v hardwaru; některé mikrokontrolery mají zásobník s pevně danou délkou, přičemž zásobník není přímo přístupný.&lt;br /&gt;
* [[Mikrokontrolér PIC|mikrokontroléry PIC]]&lt;br /&gt;
* počítač Cowboys MuP21&lt;br /&gt;
* řada Harris RTX&lt;br /&gt;
* Novix NC4016&lt;br /&gt;
&lt;br /&gt;
Hodně mikroprocesorů založených na stacku je používáno k běhu programovacího jazyka [[Forth]] na úrovní [[mikrokódu]]. Zásobník je také často používán jako základ [[Mainframe|mainfraimů]] a minipočítačů. Tyto stroje se nazývají [[zásobníkový počítač]].&lt;br /&gt;
&lt;br /&gt;
== Související články ==&lt;br /&gt;
* [[Zásobníkový automat]]&lt;br /&gt;
&lt;br /&gt;
== Externí odkazy ==&lt;br /&gt;
&lt;br /&gt;
{{Článek z Wikipedie}}&lt;br /&gt;
[[Kategorie:Datové struktury]]&lt;/div&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	</feed>