Cod sursa(job #544837)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 2 martie 2011 11:15:00
Problema Evaluarea unei expresii Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 3.05 kb
program alex;
var f:text;
    s,fp:ansistring;
    st:array[0..100000]of char;
    x,st1:array[0..100000]of longint;
    k,j,i,d,y:longint;
    er:integer;
    t:ansistring;
procedure adauga;
var t1:string;
    nr:longint;
begin
d:=d+1;
str(d,t1);
val(t,nr);
fp:=fp+'x'+t1;
x[d]:=nr;
end;
begin
assign(f,'evaluare.in');reset(f);
readln(f,s);
close(f);
insert('(',s,1);
s:=s+')';
fp:='';
t:='';
d:=0;
for i:=1 to length(s) do
    if s[i]='(' then begin
                     if t<>'' then adauga;
                     t:='';
                     k:=k+1;
                     st[k]:='(';
                     end
    else if s[i]=')' then begin
                          if t<>'' then adauga;
                          t:='';
                          j:=k;
                          while st[k]<>'(' do
                                begin
                                fp:=fp+st[k];
                                k:=k-1;
                                end;
                          k:=k-1;
                          end
    else if(s[i]='*')or(s[i]='/')then begin
                                      if t<>'' then adauga;
                                      t:='';
                                      while(st[k]='*')or(st[k]='/')do
                                           begin
                                           fp:=fp+st[k];
                                           k:=k-1;
                                           end;
                                      k:=k+1;
                                      st[k]:=s[i];
                                      end
    else if(s[i]='+')or(s[i]='-')then begin
                                      if t<>'' then adauga;
                                      t:='';
                                      while(st[k]='*')or(st[k]='/')or(st[k]='+')or(st[k]='-')do
                                          begin
                                          fp:=fp+st[k];
                                          k:=k-1;
                                          end;
                                      k:=k+1;
                                      st[k]:=s[i];
                                      end
    else t:=t+s[i];
k:=0;
i:=0;

repeat
i:=i+1;
    case fp[i] of
    '+':begin
        st1[k-1]:=st1[k-1]+st1[k];
        st1[k]:=0;
        k:=k-1;
        end;
    '-':begin
        st1[k-1]:=st1[k-1]-st1[k];
        st1[k]:=0;
        k:=k-1;
        end;
    '/':begin
        st1[k-1]:=st1[k-1] div st1[k];
        st1[k]:=0;
        k:=k-1;
        end;
    '*':begin
        st1[k-1]:=st1[k-1]*st1[k];
        st1[k]:=0;
        k:=k-1;
        end;
    'x':begin
          j:=i+1;
          t:='';
         while(fp[j]>='0')and(fp[j]<='9')do
              begin
              t:=t+fp[j];
              j:=j+1;
              end;
         i:=j-1;
         val(t,y,er);
         k:=k+1;
         st1[k]:=x[y];
        end;
    end;
until(i>=length(fp));
assign(f,'evaluare.out');rewrite(f);
writeln(f,st1[1]);
close(f);
end.