后缀转中缀的另一种方法——二叉树的遍历

 

鉴于自己虽然在向总的带领下学了树但是从来都没有用过。

在数据结构的书上,关于二叉树有这样的一段内容:当我们把表达式依照一定的规则,构成一棵树的时候,中序遍历再加一些括号是正常的表达式,后序遍历是逆波兰式。

所以,用逆波兰式构成一棵树,再依照中序遍历的法则,将后缀表达式转为中缀表达式。

构造一棵树不难,主要是添括号的问题。

所以 测了多次,问题总是出现在 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.                                                

 

posted @ 2013-01-25 21:45  改名字干什么  阅读(403)  评论(0编辑  收藏  举报