zásobník v praxi

Zásobník je datová struktura, která umožňuje dvě základní operace:

  • push(x) - uloží prvek x na vrchol zásobníku.
  • pop - vrátí prvek, který byl na vrcholu zásobníku a odebere ho.
Zásobník

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ů.