program acmb; type stack=array[1..200] of char; stack2=array[1..200] of real; var top,i,j,h:integer; temp:real; ch,w:char; a,s:stack; ss:stack2; Function t(p1:char):integer; begin case p1 of '#':t:=-1; '(':t:=0; '+':t:=1; '-':t:=1; '*':t:=2; '/':t:=2; ')':t:=3; end; end; function comp(var s:stack2):real; var i,k:integer; x:real; begin i:=1;top:=0; ch:=a[i]; while ch<>'#' do begin case ch of '0'..'9':begin x:=0; while(ch<>' ')do begin x:=x*10+ord(ch)-ord('0'); i:=i+1; ch:=a[i]; end; top:=top+1; end; '+':begin x:=s[top-1]+s[top];dec(top); end; '-':begin x:=s[top-1]-s[top];dec(top); end; '*':begin x:=s[top-1]*s[top];dec(top); end; '/':begin if s[top]<>0 then begin x:=s[top-1]/s[top];dec(top);end end; end;{case} s[top]:=x; i:=i+1; ch:=a[i]; end;{while} comp:=trunc(s[top]*1000+0.5)/1000; end;{function} procedure push(vars:stack;ch:char); begin inc(top); s[top]:=ch; end; procedure pop(vars:stack); begin dec(top); end; function readtop(s:stack):char; begin readtop:=s[top]; end; begin while not eof do begin push(s,'#'); j:=1; read(ch); while ch<>'#'do begin if ch in['0'..'9'] then begin while ch in['0'..'9'] do begin a[j]:=ch; inc(j); read(ch); end; a[j]:=' ';inc(j); end else begin case ch of '+','-','*','/': begin w:=readtop(s); {取出栈顶符号} while t(ch)<=t(w)do begin a[j]:=w;inc(j); pop(s); w:=readtop(s); end; push(s,ch); end; '(':push(s,ch); ')':begin while s[top]<>'('do begin a[j]:=s[top];inc(j); pop(s); end; top:=top-1; end; end; {end case} read(ch); end;{end while} end; w:=readtop(s); while w<>'#' do begin a[j]:=w;inc(j); pop(s);w:=readtop(s); end; a[j]:='#';pop(s); fillchar(ss,sizeof(ss),0); temp:=comp(ss); writeln(temp:0:0); end; end. /************************************************************** Problem: 2145 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/