zásobník v praxi
Zásobník je datová struktura, která umožňuje dvě základní operace:
push(x)
- uloží prvekx
na vrchol zásobníku.pop
- vrátí prvek, který byl na vrcholu zásobníku a odebere ho.
Zkuste si implementovat zásobník třeba pomocí pole. Správný zásobník funguje na principu LIFO (Last In First Out) - v praxi to znamená, že poslední věc, kterou do něj uložíme pomocí operace push
bude první, kterou dostaneme ven pomocí operace pop
.
Závorky
Program, který kontroluje správné uzávorkování výrazu lze snadno implementovat, použijeme-li zásobník. Algoritmus byl předveden na cvičení a je tématem jednoho z domácích úkolů.
Postfixová notace
Výraz 5+((1+2)*4)-3
je v tzv. infixové notaci.
Na cvičení jsme si ukázali, že existuje také prefixová a posfixová
notace, které nepotřebují závorky a jsou tímpádem vhodnější pro strojové zpracování.
V posfixové notaci může tentýž výraz vypadat třeba takhle: 512+4*+3-
.
Můžeme ho potom snadno vyhodnotit pomocí zásobníku:
repeat read(zn) // cteme vyraz po znacich if jeCislo(zn) then push(zn) // vlozime cislo na zasobnik else if jeOperator(zn) then a:= pop; // vybereme 2. operand ze zasobniku b:= pop; // vybereme 1. operand ze zasobniku push(zpracuj(a,b,zn)) // vyhodnotime vyraz // a vysledek ulozime na zasobnik until konecVyrazu
Výše uvedený pseudokód jsme si interaktivně vyzkoušeli během cvičení na tabuli. Nemělo by pro vás být příliš obtížné napsat podle něj funkční program v Pascalu.
Rekurze
Jako rozcvičku jsme si naprogramovali rekurzivně funkci:
function mocni(zakl,exp: integer): integer;
V praxi jsme si na ní předvedli dvě základní komponenty,
ze kterých se skládá každá dobře vychovaná rekurzivní funkce:
- 1. ukončovací podmínka rekurze - je-li zadání triviální, vyřešíme ho hned (funkce
mocni
například testuje, jestli exponent náhodou není 0 - pokud ano, tak vrátí 1) - 2. zjednodušení problému a rekurzivní volání - je-li zadání
příliš komplikované,
provedeme jeden krok směrem k řešení a zbytek za nás vyřeší rekurze
(funkce
mocni(zakl,exp)
například vrátí:zakl * mocnina(zakl, exp - 1)
)
K řešení druhého domácího úkolu je zapotřebí o něco složitější rekurze, kterou jsme programovali na tabuli ve zbytku cvičení.
Domácí úkol
V CodExu byly zadány 2 úlohy: Kontrola uzávorkování, Rozklad na součet. Každá je za 18 bodů.