Cviceni Navrh Algoritmu I
Prevody mezi infixem a postfixem
Vyhodnoceni aritmetickeho vyrazu v postfixu
Aritmeticke vyrazy lze zapisovat ve trech ruznych matematickych notacich:
- infixove - operator je mezi operandy, napr. X*2+Y
- prefixove - operator je pred operandy, napr. +(*(X,2),Y)
- postfixove - operator je za operandy, napr. X 2 * Y +
Prvni dve notace se v matematickych vyrazech pouzivaji, treti (postfixova)
se beznou nestala, i kdyz je z nekolika hledisek vyhodnejsi.
Hlavni vyhodou je, ze prefixova notace nevyzaduje zavorky,
ani konvence o priorite operatoru a jednoduse se vyhodnocuje.
Priorita operatoru je totiz zrejma ze zapisu, ve vyse uvedenem
vyrazu nasobeni ma prioritu pred scitanim, proto X*2+Y
zapiseme jako X 2 * Y +. Kdyby scitani melo prioritu pred
nasobenim, byl by odpovidajici zapis v postfixu X 2 Y * +.
Pro prevod mezi infixem a postfixem se pouziva zasobnik. Pri prevodu
z infixu do postfixu ukladame do zasobniku operatory, pri opacnem
prevodu operandy. Algoritmy vypadaji nasledovne:
Algoritmus infix->postfix:
- operandy na vstupu posilej primo na vystup
- operator na vstupu, ktery ma vyssi prioritu nez operator na vrcholu
zasobniku (nebo je-li zasobnik prazdny), posli do zasobniku
- je-li operator na vstupu nizsi nebo stejne priority jako v zasobniku,
posli na vystup operator z vrcholu zasobniku; tento postup opakuj, dokud
nenastane situace z predchoziho bodu (t.j. ze na vrcholu zasobniku je
operator nizsi priority nez na vstupu nebo je zasobnik jiz prazdny)
- levou zavorku, ktera se objevi na vstupu, presuneme do zasobniku
a budeme ji povazovat za docasne relativni dno zasobniku;
tim jsme zalozili novou vrstvu zasobniku
- pravou zavorku, ktera se objevi na vstupu, povazujeme za docasny
relativni ukoncujici symbol; vyvola odchod vsech symbolu az po
nejblizsi relativni dno zasobniku a zrusi tak jeho vrchni vrstvu;
obe zavorky (ktere se nyni priblizily na dosah) splnily svou funkci a mizi
Algoritmus postfix->infix:
Vyhodnoceni aritmetickeho vyrazu v postfixu:
- operandy na vstupu posilej do zasobniku
- pokud se objevi na vstupu operand, odeber ze zasobniku tolik
operandu, kolik cini arita operatoru
(t.j. pocet operandu operatoru, u infixu je arita operatoru rovna dvema);
proved nad odebranymi operandy prislusnou operaci nebo zjednodus vyraz
a prepis ho do infixove notace; vysledek vrat zpet na vrchol zasobniku
- po precteni celeho vstupu je vysledek na vrcholu zasobniku (zasobnik
by mel obsahovat prave jednu polozku); vyber vysledek ze zasobniku
a vypis ho na vystup