Cod sursa(job #377254)

Utilizator arnold23Arnold Tempfli arnold23 Data 23 decembrie 2009 20:18:46
Problema Evaluarea unei expresii Scor 30
Compilator fpc Status done
Runda Arhiva educationala Marime 2.6 kb
type fa=^elem;
     elem=record
        x:string;
        bal,jobb:fa;
     end;
     adat=record
        o:string;
        p:longint;
     end;

var v:array[1..100000] of adat;
    ve:array[1..100000] of longint;
    f:text;
    s:string;
    a:char;
    k,p,db:longint;
    gyoker:fa;

procedure betesz(var ho:longint;mit:string;prior:longint);
begin
  inc(ho);
  v[ho].o:=mit;
  v[ho].p:=prior;
end;

procedure kiir(ho:longint);
var p:longint;
begin
   for p:=1 to ho do write(v[p].o,'  ');
   writeln;
   for p:=1 to ho do write(v[p].p,' ');

end;

procedure keres(var old:fa;el,ve:longint);
var min,i,h:longint;
begin
  min:=maxlongint;
  for i:=el to ve do
    if v[i].p<min then
    begin
      min:=v[i].p;
      h:=i;
    end;

  new(old);
  old^.x:=v[h].o;
  old^.bal:=nil;
  old^.jobb:=nil;
  if el<>ve then begin
    keres(old^.bal,el,h-1);
    keres(old^.jobb,h+1,ve);
  end;
end;

procedure kiertekel(gy:fa);
var kod:integer;
begin
   if gy<>nil then begin
      kiertekel(gy^.bal);
      kiertekel(gy^.jobb);

         if gy^.x='+' then begin ve[k-1]:=ve[k-1]+ve[k]; dec(k); end else
         if gy^.x='-' then begin ve[k-1]:=ve[k-1]-ve[k]; dec(k); end else
         if gy^.x='*' then begin ve[k-1]:=ve[k-1]*ve[k]; dec(k); end else
         if gy^.x='/' then begin ve[k-1]:=ve[k-1] div ve[k]; dec(k); end else
         begin
           inc(k);
           val(gy^.x,ve[k],kod);
         end;
   end;
end;

procedure kiirfapos(gy:fa);
begin
   if gy<>nil then begin
      kiirfapos(gy^.bal);
      kiirfapos(gy^.jobb);
      write(gy^.x,' ');
   end;
end;


begin
  assign(f,'evaluare.in');
  reset(f);
  k:=0;
  s:='';
  p:=0;
  db:=0;
  read(f,a);
  while not eoln(f) do begin
     if a='(' then begin
       inc(p,10);
       read(f,a);
     end;
     if a=')' then begin
       dec(p,10);
       read(f,a);
     end;
     if a in ['0'..'9'] then begin
       s:=a;
       read(f,a);
       while a in ['0'..'9'] do begin
        s:=s+a;
        read(f,a);
       end;
       betesz(db,s,p+15);
       s:='';
     end;
     if a in ['+','-'] then begin
       betesz(db,a,p+3);
       read(f,a);
     end;
     if a in ['*','/'] then begin
       betesz(db,a,p+5);
       read(f,a);
     end;

  end;
  close(f);

  gyoker:=nil;
  keres(gyoker,1,db);


  writeln;
  writeln;
  kiir(db);

  writeln;
  writeln;
  kiirfapos(gyoker);

  kiertekel(gyoker);
  writeln;
  writeln;
  writeln(ve[1]);


  kiertekel(gyoker);
  assign(f,'evaluare.out');
  rewrite(f);
  writeln(f,ve[1]);
  close(f);


end.