Cod sursa(job #145594)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 28 februarie 2008 23:39:28
Problema Evaluarea unei expresii Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 2.32 kb
var fi,fo:text;
    s:ansistring;
    vf,ct:longint;
    v:array[1..100000]of char;
    f:array[1..100000]of string[10];
    rez:array[1..100000]of longint;
procedure push(vl:char);
begin
  inc(vf);
  v[vf]:=vl;
end;
procedure pop(var vl:char);
begin
  vl:=v[vf];
  dec(vf);
end;
procedure solve;
var i,n1,n2,p:longint;
begin
  vf:=0; p:=1;
  if s[1]='-' then
    begin
      inc(vf); val(f[1],rez[1]);
      rez[1]:=-rez[1]; p:=2;
    end;
  for i:=1 to ct do
    if f[i][1] in ['0'..'9'] then
       begin
         inc(vf); val(f[i],rez[vf]);
       end
    else
      begin
        if f[i]='+' then rez[vf-1]:=rez[vf]+rez[vf-1]
         else
          if f[i]='-' then rez[vf-1]:=rez[vf-1]-rez[vf]
           else
            if f[i]='/' then rez[vf-1]:=rez[vf-1] div rez[vf]
             else
              if f[i]='*' then rez[vf-1]:=rez[vf-1]*rez[vf];
        dec(vf);
      end;
  writeln(fo,rez[1]);
end;
procedure eval;
var i,lung,p:longint;
    nr:string;
    vv:char;
begin
  lung:=length(s);
  nr:='';
  p:=1;
  if s[1]='-' then p:=2;
  for i:=p to lung do
    begin
      if s[i] in ['0'..'9'] then nr:=nr+s[i];
      if s[i]='(' then push(s[i]);
      if s[i]=')' then
        begin
          inc(ct); f[ct]:=nr; nr:='';
          while v[vf]<>'(' do
            begin
              pop(vv); inc(ct); f[ct]:=vv;
            end;
          pop(vv);
        end;
      if s[i] in ['+','-'] then
        begin
          if nr<>'' then
            begin
              inc(ct); f[ct]:=nr; nr:='';
            end;
          while (vf<>0)and(v[vf]<>'(') do
            begin
              pop(vv); inc(ct); f[ct]:=vv;
            end;
          push(s[i]);
        end;
      if s[i] in ['*','/'] then
        begin
          if nr<>'' then
            begin
              inc(ct); f[ct]:=nr; nr:='';
            end;
          while (vf<>0)and((v[vf]='*')or(v[vf]='/')) do
            begin
              pop(vv); inc(ct); f[ct]:=vv;
            end;
          push(s[i]);
        end;
    end;
  inc(ct); f[ct]:=nr;
  while vf<>0 do
    begin
      pop(vv); inc(ct); f[ct]:=vv;
    end;
  solve;
end;
begin
  assign(fi,'evaluare.in'); reset(fi);
  assign(fo,'evaluare.out'); rewrite(fo);
  readln(fi,s);
  vf:=0; ct:=0;
  eval;
  close(fi);
  close(fo);
end.