Cod sursa(job #393275)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 9 februarie 2010 09:53:46
Problema Evaluarea unei expresii Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 3.36 kb
program evaluare;
type rec = record
   s:string[10];
   v:longint;
end;

Type REF = ^NOD;
   NOD = record
      left,right:REF;
      index:longint;
      //s:string;
   end;

var fin,fout:text;
    nr1,nr2,i,j,n,m,vn,xn,paranteza:longint;
    f:integer;
    c:char;
    root:REF;
    x:array [1..1000000] of rec;
    v:array [1..1000000] of string[10];
    s:string;
{*-----------------------------------------*}
procedure introdu;
begin
   inc(xn);
   x[xn].s:=s;
   x[xn].v:=paranteza+10000;
   s:='';
end;
{*-----------------------------------------*}
procedure cauta(left,right:longint; var nod:ref);
var i,min,mini:longint;
begin
   min:=maxint;
   for i:=left to right do
   if min >= x[i].v then
   begin
      min:=x[i].v;
      mini:=i;
   end;
   if min = maxint then
   begin
      nod:=nil;
      exit;
   end;

   new(NOD);
   NOD^.index:=mini;
   //NOD.s:=x[mini].s;
   cauta(left,mini-1,NOD^.left);
   cauta(mini+1,right,NOD^.Right);
end;
{*-----------------------------------------*}
procedure getNr(i:longint);
begin
  dec(i);
  while v[i] = '$' do dec(i);
  val(v[i],nr2,f);
  v[i]:='$';

  dec(i);
  while v[i] = '$' do dec(i);
  val(v[i],nr1,f);
  v[i]:='$';
end;
{*-----------------------------------------*}
procedure solutie(nod:ref);
begin
   if nod^.left <> nil then solutie(nod^.left);
   if nod^.right <> nil then solutie(nod^.right);
   inc(vn);
   v[vn]:=x[NOD^.index].s;
//   write(fout,,' ');
end;
{*-----------------------------------------*}
begin
   assign(fin,'evaluare.in'); reset(fin); assign(fout,'evaluare.out'); rewrite(fout);

   vn:=0;
   while not eoln(fin) do
   begin
      read(fin,c);
      case c of
         '+':begin
               if s <> '' then introdu;
               inc(xn);
               x[xn].s:=c;
               x[xn].v:=paranteza+1;
             end;
         '-':begin
               if s <> '' then introdu
               else
               begin
                  s:='0';
                  introdu;
               end;
               inc(xn);
               x[xn].s:=c;
               x[xn].v:=paranteza+1;
             end;
         '*':begin
               if s <> '' then introdu;
               inc(xn);
               x[xn].s:=c;
               x[xn].v:=paranteza+10;
             end;
         '/':begin
               if s <> '' then introdu;
               inc(xn);
               x[xn].s:=c;
               x[xn].v:=paranteza+10;
             end;
         '(':begin
               paranteza:=paranteza+100;
               if s <> '' then introdu;
             end;
         ')':begin
               paranteza:=paranteza-100;
               if s <> '' then introdu;
             end;
         else
         begin
            s:=s+c;
         end;
      end;
   end;
   if s <> '' then introdu;

   cauta(1,xn,root);
   vn:=0;
   solutie(root);
   for i:=1 to vn do
   begin
     if v[i] = '+' then
     begin
        getnr(i);
        str(nr1+nr2,v[i]);
     end;
     if v[i] = '-' then
     begin
        getnr(i);
        str(nr1-nr2,v[i]);
     end;
     if v[i] = '*' then
     begin
        getnr(i);
        str(nr1*nr2,v[i]);
     end;
     if v[i] = '/' then
     begin
        getnr(i);
        str(nr1 div nr2,v[i]);
     end;
   end;

   writeln(fout,v[vn]);
   close(fin); Close(fout);
end.