鉴于自己虽然在向总的带领下学了树但是从来都没有用过。
在数据结构的书上,关于二叉树有这样的一段内容:当我们把表达式依照一定的规则,构成一棵树的时候,中序遍历再加一些括号是正常的表达式,后序遍历是逆波兰式。
所以,用逆波兰式构成一棵树,再依照中序遍历的法则,将后缀表达式转为中缀表达式。
构造一棵树不难,主要是添括号的问题。
所以 测了多次,问题总是出现在 compare函数上(程序里成comepare了),
不过感觉这个comepar函数还是比较好写的,相比起 用栈来做。。。。。
主要是减号和除号的问题。。。
1 program expression; 2 type 3 point=^rec; 4 rec=record 5 left,right:point; 6 ch:char; 7 end; 8 var 9 i,j,k,l,m,n:longint; 10 st,stt:string; 11 h:point; 12 procedure make(var l:longint;p:point); 13 var 14 i,j,k,m,n:longint; 15 begin 16 if l>=1 then begin 17 if(ord(st[l])<65)or(ord(st[l])>90)then 18 begin 19 p^.ch:=st[l]; 20 dec(l); 21 new(p^.right); 22 make(l,p^.right); 23 dec(l); 24 new(p^.left); 25 make(l,p^.left); 26 end 27 else 28 begin 29 p^.ch:=st[l]; 30 p^.left:=nil; 31 p^.right:=nil; 32 end; 33 end; 34 end; 35 {===============================================================} 36 function print(p:point):ansistring; 37 var 38 a,b,c,d:string; 39 bool1,bool2:boolean; 40 le,ri,mi:char; 41 function comepare(a,b:char):char; 42 var 43 x,y:longint; 44 begin 45 if(((a='-')and((b='-')or(b='+')))or((a='/') and ((b='/')or(b='*'))))then exit('>'); 46 case a of 47 '+','-':x:=2; 48 '*','/':x:=4; 49 end; 50 case b of 51 '+','-':y:=2; 52 '*','/':y:=4; 53 end; 54 if x>y then exit('>') 55 else exit('<'); 56 end; 57 {===============================================================} 58 begin 59 bool1:=true; 60 bool2:=true; 61 print:=''; 62 if p^.left<>nil then 63 begin 64 le:=p^.left^.ch; 65 ri:=p^.right^.ch; 66 mi:=p^.ch; 67 if(ord(le)>=65)and(ord(le)<=90)then bool1:=false; 68 if(ord(ri)>=65)and(ord(ri)<=90)then bool2:=false; 69 begin 70 if(comepare(mi,le)='>')and((mi<>'-')or((le<>'-')and(le<>'+')))and((mi<>'/')or((le<>'/')and(le<>'*')))and bool1 then 71 begin 72 a:='('; b:=')'; 73 end 74 else 75 begin 76 a:='';b:=''; 77 end; 78 if (comepare(mi,ri)='>')and bool2 then 79 begin 80 c:='('; d:=')'; 81 end 82 else 83 begin 84 c:='';d:=''; 85 end; 86 print:=a+print(p^.left)+b+mi+c+print(p^.right)+d; 87 end 88 end 89 else exit(p^.ch); 90 end; 91 begin 92 assign(input,'expression.in'); 93 assign(output,'expression.out'); 94 reset(input); 95 rewrite(output); 96 readln(st); 97 l:=length(st); 98 new(h); 99 make(l,h); 100 stt:=print(h); 101 write(stt); 102 close(input); 103 close(output); 104 end.