program aritmetickaStabla;
type
  tip = (operacija,broj);
  pokStablo = ^stablo;
  stablo = record
           levo,desno:pokStablo;
           case podatak:tip of
             operacija : (opr:char);
             broj : (vrednost:integer) ;
           end;
 pokStek = ^stek;
 stek = record
        cvor:pokStablo;
        sledeci : pokStek;
        end;

function dubina(koren:pokStablo):integer;
var
d,d_levo,d_desno:integer;
begin
d:=0;
if (koren <> nil) then
  begin
    d_levo:=dubina(koren^.levo);
    d_desno:=dubina(koren^.desno);
    if (d_levo > d_desno) then d:=d_levo
    else d:=d_desno;
    d:=d+1;
  end;
dubina:=d;
end;
procedure ispisN(koren:pokStablo;n:integer);
begin

if (koren <> nil) then
begin
  if (n = 0 ) then if (koren^.podatak=operacija) then write(koren^.opr) else write(koren^.vrednost,' ')
  else
    begin
     ispisN(koren^.levo,n-1);
     ispisN(koren^.desno,n-1);
    end;
end;
end;
procedure dodajNaStek(var vrh:pokStek;cvor:pokStablo)    ;
var
 pom:pokStek;
begin
  if (vrh = nil) then
     begin
      new(vrh);
      vrh^.cvor:=cvor;
      vrh^.sledeci:=nil;
     end
  else
   begin
   new(pom);
   pom^.cvor := cvor;
   pom^.sledeci:=vrh;
   vrh:=pom;
   end;
end;
function skiniSaSteka(var vrh:pokStek):pokStablo  ;
 var
  pom:pokStek;
  begin
    pom:=vrh;
    vrh:=vrh^.sledeci;
    skiniSaSteka:=pom^.cvor;
  end;

procedure dodaj(var pocetak:pokStablo)    ;
var
f:Text;
c:char;
s:string ;
d,br,i:Integer;
cvor,levo,desno:pokStablo;
vrhSteka:pokStek;
 begin
   vrhSteka:=nil;
d:=0;
assign(f,'arit.txt');
reset(f);
while(not eoln(f)) do
  begin
    read(f,c);
 s:='';
    d:=0;
    while((c>='0') and (c<='9')) do
      begin
         d:=d+1;
        //s[d]:=c;
        s:=s+c;
        read(f,c);
      end;
  if (d>0) then
     begin
      Val(s,br,i);
      writeln('Ucitani broj je ',br);
      new(cvor);
      cvor^.podatak:=broj;
      cvor^.vrednost:=br;
      cvor^.levo:=nil;
      cvor^.desno:=nil;
      dodajNaStek(vrhSteka,cvor);
      end     ;
  if ((c<>')') and (c<>'(') ) then
     begin
     writeln('Ucitan je znak',c);
     new(cvor);
      cvor^.podatak:=operacija;
      cvor^.opr:=c;
      cvor^.levo:=nil;
      cvor^.desno:=nil;
      dodajNaStek(vrhSteka,cvor);
     end
  else if(c=')') then
       begin
         desno:=skiniSaSteka(vrhSteka);
         cvor:=skiniSaSteka(vrhSteka);
         levo:=skiniSaSteka(vrhSteka);
         cvor^.levo:=levo;
         cvor^.desno:=desno;
         dodajNaStek(vrhSteka,cvor);
        end;

 end;

pocetak:=skiniSaSteka(vrhSteka);
end;
function izracunaj(koren:pokStablo;var greska:integer):real;
var
 levo,desno,rez:real;
 g1,g2:integer;
 begin
   if (  koren <> nil) then
   begin
     if (koren^.podatak=broj) then rez:=koren^.vrednost
     else if (koren^.podatak=operacija) then
           begin
           levo := izracunaj(koren^.levo,g1);
           desno:=izracunaj(koren^.desno,g2);
            if ((g1 <> 1) and (g2 <> 1)) then
            begin
            case koren^.opr of
            '+' : rez:=levo+desno;
            '-' : rez:=levo-desno;
            '*' : rez := levo*desno;
            '/' : begin if desno=0 then greska:=1 else rez:=levo/desno; end;
            end  ;
            end
            else
              begin
              greska:=1;
              rez:=-1;
              end;
            end;
 end
   else
       begin
       greska :=1;
       rez:=-1;
       end;
izracunaj := rez;
end;
var
koren:pokStablo;
f:Text;
c:char;
s:array[1..10] of char;
d,br,i:Integer;





begin


koren:=nil;
dodaj(koren);
  d:=dubina(koren);
  for i:=0 to d do
   begin
   ispisN(koren,i);
   writeln;
   end;
  br:=0;
writeln('Rezultat izraza je ', izracunaj(koren,br):3:3);
if (br>0) then writeln('Desila se greska!');
 readln(br);

end.
