program vyraz; var s : stack of char; c : char; { Vrátí operátor na vrcholu zásobníku. } { Pokud tam žádný není, vrátí '#'. } function vrchni_op : char; var num, op : char; begin num := pop(s); if empty(s) then op := '#' else begin op := pop(s); push(s, op); end; push(s, num); vrchni_op := op; end; { Vyhodnotí operátor na vrcholu zásobníku. } procedure vyhodnot; var a, b, op, vysledek : char; begin b := pop(s); op := pop(s); a := pop(s); if op = '&' then vysledek := a='1' and b='1'; if op = '|' then vysledek := a='1' or b='1'; if op = '(' then vysledek := b='1'; if vysledek then push(s, '1') else push(s, '0'); end; begin while read(c) do case c of '0' , '1' : push(s, c); { Číslo uložíme na zásobník. } '&' : begin { Vyhodnotit všechny '&'. } while vrchni_op = '&' do vyhodnot; push(s, c); end; '|' : begin { Vyhodnotit všechny '&' nebo '|'. } while vrchni_op in ['&', '|'] do vyhodnot; push(s, c); end; '(' : begin { Před závorku uložíme pomocnou nulu. } push(s, '0'); push(s, c); end; ')' : begin { Vyhodnotit až do '('. } while vrchni_op <> '(' do vyhodnot; vyhodnot; { Odstraní '(' z vrcholu zásobníku. } end; end; while vrchni_op <> '#' do vyhodnot; write(pop(s)); end.