Zásobník (stack) je jednou ze základních datových struktur, která se využívá především pro dočasné ukládání dat v průběhu výpočtu. Zásobník data ukládá způsobem, kterému se říká LIFO - last in, first out - čili poslední vložený prvek jde na výstup jako první, předposlední jako druhý a tak dále. Opačným způsobem funguje datový typ fronta - FIFO - first in, first out.
Základní operace
Abstraktní datový typ zásobník specifikuje tyto operace:
- push - vloží prvek na vrch zásobníku
- pop - odstraní vrchol zásobníku
- top - dotaz na vrchol zásobníku
- isEmpty - dotaz na prázdnost zásobníku (size - dotaz na velikost zásobníku)
Využití
Zásobník se v informatice používá zejména pro ukládání stavu algoritmů a programů. Je použit v Tarjanově algoritmu, v prohledávání do hloubky a implicitně ve všech rekurzivních algoritmech. Na zásobníkové architektuře jsou postaveny virtuální stroje pro jazyky Java a Lisp.
Kód
01.
/**
02.
* Zasobnik
03.
* Implementovan jako spojovy seznam
04.
*/
05.
public
class
Stack {
06.
07.
private
Node first;
08.
private
int
size;
09.
10.
public
Stack() {
11.
this
.size =
0
;
12.
}
13.
14.
/**
15.
* Ulozi prvek na vrch zasobniku
16.
* Slozitost - O(1)
17.
* @param i prvek k ulozeni
18.
*/
19.
public
void
push(
int
i) {
20.
Node n =
new
Node(i);
21.
22.
Node currFirst = first;
23.
first = n;
24.
n.next = currFirst;
25.
26.
size++;
27.
}
28.
29.
/**
30.
* Odstrani vrchni prvek ze zasobniku
31.
* Slozitost - O(1)
32.
* @return hodnota vrchniho prvku
33.
*/
34.
public
int
pop() {
35.
if
(size ==
0
) {
36.
throw
new
IllegalStateException(
"Zasobnik je prazdny, nelze odebrat prvek"
);
37.
}
38.
int
value = first.value;
39.
first = first.next;
40.
size--;
41.
return
value;
42.
}
43.
44.
/**
45.
* Vrati vrchol zasobniku
46.
* Slozitost - O(1)
47.
* @return hodnota vrchniho prvku
48.
*/
49.
public
int
top() {
50.
if
(size ==
0
) {
51.
throw
new
IllegalStateException(
"Zasobnik je prazdny, nelze vratit"
);
52.
}
53.
return
first.value;
54.
}
55.
56.
/**
57.
* Vrati velikost zasobniku
58.
* @return velikost zasobniku
59.
*/
60.
public
int
getSize() {
61.
return
this
.size;
62.
}
63.
64.
/**
65.
* Klasicka toString metoda, vraci textovou reprezentaci objektu
66.
* @return textova reprezentace objektu
67.
*/
68.
@Override
69.
public
String toString() {
70.
StringBuilder builder =
new
StringBuilder();
71.
Node curr = first;
72.
for
(
int
i =
0
; i <
this
.size; i++) {
73.
builder.append(curr.value).append(
" "
);
74.
curr = curr.next;
75.
}
76.
return
builder.toString();
77.
}
78.
79.
/**
80.
* Vnitrni trida reprezentujici uzel spojoveho seznamu
81.
*/
82.
private
class
Node {
83.
84.
private
int
value;
85.
private
Node next;
86.
87.
private
Node(
int
value) {
88.
this
.value = value;
89.
}
90.
}
91.
}