uses crt; type valtype=char; tsign=(none,addition,substraction,multiplication,division); pnode=^tnode; tnode=record l,r,next:pnode; val:valtype; sign:tsign; end; function tostr(v:integer):string; var s: string; begin str(v,s); tostr:=s; end; function toval(s:string):word; var v,c:word; begin val(s,v,c); toval:=v; end; function nodebycount(root:pnode;number:word):pnode; var p:word; a:pnode; begin a:=root; for p:=1 to number-1 do a:=a^.next; nodebycount:=a; end; function createvaluenode(val:valtype):pnode; var node:pnode; begin new(node); node^.l:=nil; node^.r:=nil; node^.next:=nil; node^.sign:=none; node^.val:=val;; createvaluenode:=node; end; function createsignnode(l,r:pnode;sign:char):pnode; var node:pnode; begin new(node); node^.l:=l; node^.r:=r; node^.next:=nil; node^.val:=#0; case sign of '*': node^.sign:=multiplication; '/': node^.sign:=division; '+': node^.sign:=addition; '-': node^.sign:=substraction; end; createsignnode:=node; end; function maketree(var s:string;var root:pnode):pnode; var p,o,i,j:byte; valch:byte; s2,s3:string; node,ln,rn:pnode; begin s:='('+s+')'; valch:=0; root:=nil; s2:=''; for p:=1 to length(s) do begin if s[p] in ['A'..'Z'] then begin inc(valch); if root=nil then begin root:=createvaluenode(s[p]); node:=root; end else begin node^.next:=createvaluenode(s[p]); node:=node^.next; end; s2:=s2+tostr(valch); end else if s[p]<>' ' then s2:=s2+s[p]; end; s:=s2; s2:=''; for p:=1 to length(s) do if s[p]=')' then begin for o:=length(s2) downto 1 do if s2[o]='(' then break; s3:=copy(s2,o+1,255); s2:=copy(s2,1,o-1); o:=1; repeat if s3[o] in ['*','/'] then begin inc(valch); i:=1; while(o>1+i)and(s3[o-1-i] in ['0'..'9']) do inc(i); ln:=nodebycount(root,toval(copy(s3,o-i,i))); j:=1; while(o+jlength(s3); o:=1; repeat if s3[o] in ['+','-'] then begin inc(valch); i:=1; while(o>1+i)and(s3[o-1-i] in ['0'..'9']) do inc(i); ln:=nodebycount(root,toval(copy(s3,o-i,i))); j:=1; while(o+jlength(s3); s2:=s2+s3; end else s2:=s2+s[p]; maketree:=nodebycount(root,valch); end; function makePrefix(node:pnode):string; begin case node^.sign of multiplication: makePrefix:='*'+makePrefix(node^.l)+makePrefix(node^.r); division: makePrefix:='/'+makePrefix(node^.l)+makePrefix(node^.r); addition: makePrefix:='+'+makePrefix(node^.l)+makePrefix(node^.r); substraction: makePrefix:='-'+makePrefix(node^.l)+makePrefix(node^.r); none: makePrefix:=node^.val; end; end; const s: string='((A + B) * (C - D) + E) * F'; var root,node:pnode; begin writeln('string = ', s); node:=maketree(s,root); writeln('prefix = ', makePrefix(node)); end.