Cod sursa(job #227118)

Utilizator gggbbbyyyDarkMan gggbbbyyy Data 3 decembrie 2008 18:52:47
Problema Evaluarea unei expresii Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 1.92 kb
type lg=-1000000000..1000000000;
     pnod=^nod;
     nod=record
       x:lg;
       s,d:pnod;
     end;

var f:text;
    a:array[1..100000]of char;
    b:array[1..100000]of lg;
    i,la,lb,pr,n:lg;
    p:pnod;

function eval(x:pnod):lg;
begin
  if (x^.s<>nil) then
    begin
      case (x^.x mod 5) of
        1: eval:=eval(x^.s)+eval(x^.d);
        2: eval:=eval(x^.s)-eval(x^.d);
        3: eval:=eval(x^.s)*eval(x^.d);
        4: eval:=eval(x^.s)div eval(x^.d);
      end;
    end
  else
    eval:=x^.x;
end;

function carb(x1,x2:integer):pnod;
var min,p:lg;
    x:pnod;
begin
  if x1<>x2 then
    begin
      p:=x1+1;
      min:=b[p];
      for i:=x1 to x2 do
        if (i mod 2=0)and(b[i]<min)then
          begin
            p:=i;
            min:=b[p];
          end;
      new(x);
      x^.x:=b[p];
      x^.s:=carb(x1,p-1);
      x^.d:=carb(p+1,x2);
    end
  else
    begin
      new(x);
      x^.x:=b[x1];
      x^.d:=nil;
      x^.s:=nil;
    end;
carb:=x;
end;


begin
assign(f,'evaluare.in');
reset(f);
la:=0;
while not eoln(f) do
  begin
    inc(la);
    read(f,a[la]);
  end;
n:=0;
lb:=0;
for i:=1 to la do
  begin
    if a[i]='(' then
      pr:=pr+5;
    if a[i]=')' then
      pr:=pr-5;
    if a[i]='+' then
      begin
        inc(lb);
        b[lb]:=pr+1;
      end;
    if a[i]='-' then
      begin
        inc(lb);
        b[lb]:=pr+2;
      end;
    if a[i]='*' then
      begin
        inc(lb);
        b[lb]:=pr+3;
      end;
    if a[i]='/' then
      begin
        inc(lb);
        b[lb]:=pr+4;
      end;
    if a[i] in['0'..'9'] then
      begin
        n:=n*10+ord(a[i])-48;
        if not(a[i+1] in ['0'..'9']) then
          begin
            inc(lb);
            b[lb]:=n;
            n:=0;
          end;
      end;
  end;
p:=carb(1,lb);
close(f);
assign(f,'evaluare.out');
rewrite(f);
write(f,eval(p));
close(f);
end.