Zásobník je datová struktura Last In, First Out (LIFO), což znamená, že poslední položka přidaná do zásobníku bude první, která bude odstraněna. Toto chování je užitečné v mnoha programových kontextech, jako je porovnávání závorek, vyhodnocování výrazů nebo dokonce trasování zásobníku volání programu. Pojďme se ponořit do implementace a použití zásobníku znaků v Javě.
Vytváření hromady postav
V Javě, Stoh třídy, kterou poskytuje java.util balíček lze použít k vytvoření zásobníku znaků. Zde je jednoduchý příklad, jak deklarovat zásobník znaků a provádět základní operace, jako je tlačení, vyskakování a prohlížení:
import java.util.Stack; public class CharStack { public static void main(String[] args) { Stack<Character> stack = new Stack<>(); // Push characters onto the stack stack.push('A'); stack.push('B'); stack.push('C'); // Pop and peek characters from the stack System.out.println(stack.pop()); System.out.println(stack.peek()); } }
Použití zásobníku znaků k řešení problémů
Zásobníky znaků jsou zvláště užitečné pro řešení problémů, které zahrnují manipulaci s řetězci nebo vyžadují sledování vnořených prvků. Jako příklad zvažte problém kontroly, zda je daný řetězec závorek vyvážený.
Řetězec je považován za vyvážený, pokud:
- Každá otevírací závorka má odpovídající uzavírací závorku
- Dvojice závorek jsou správně vnořené
K efektivnímu vyřešení tohoto problému můžeme použít zásobník znaků pomocí následujících kroků:
1. Inicializujte prázdný zásobník znaků
2. Projděte každý znak ve vstupním řetězci
3. Pokud je znakem otevírací závorka, zatlačte jej na hromádku
4. Pokud je znakem uzavírací závorka, zkontrolujte, zda je zásobník prázdný, a vysuňte horní prvek, pokud se jedná o odpovídající otevírací závorku.
5. Pokud po zpracování všech znaků není zásobník prázdný, je řetězec nevyvážený
Zde je kód Java pro výše uvedený postup:
public static boolean isBalanced(String input) { Stack<Character> stack = new Stack<>(); for (char c : input.toCharArray()) { if (c == '(' || c == '{' || c == '[') { stack.push(c); } else if (c == ')' || c == '}' || c == ']') { if (stack.isEmpty()) { return false; } char top = stack.pop(); if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false; } } } return stack.isEmpty(); }
Pochopením a využitím datové struktury zásobníku můžeme efektivně řešit složité programovací problémy, jako jsou ty, které zahrnují manipulaci s řetězci, analýzu a analýzu syntaxe. Navíc s třídou Stack dostupnou v java.util balíček, implementace a používání zásobníků postav v Javě se stává pohodlným úkolem.