转载了大神的一篇文章,关于表达式的二叉树遍历

给出一个由加减乘除和括号构成的表达式计算表达式的值和表达式的前缀和后缀表达式

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<math.h>  
  4. #define Inf 1e9  
  5. struct tree  
  6. {  
  7.     double date;  
  8.     char ch;  
  9.     tree *l,*r;  
  10.     tree()  
  11.     {  
  12.         ch='\0';  
  13.         date=0;  
  14.         l=r=NULL;  
  15.     }  
  16. };  
  17. double judge(char *s,int x,int y,double &n)  
  18. {  
  19.     double num=0;  
  20.     int i,ok=0;  
  21.     for(i=x; i<y; i++)  
  22.         if(s[i]>='0'&&s[i]<='9')  
  23.         {  
  24.             if(!ok)num=num*10+s[i]-'0';  
  25.             else num+=(s[i]-'0')*pow(10,ok-i);  
  26.         }  
  27.         else if(s[i]=='.'){ok=i;}  
  28.         else return 0;  
  29.     return n=num;  
  30. }  
  31. tree *build(char *s,int x,int y)  
  32. {  
  33.     tree *now=new tree;  
  34.     double num=Inf;  
  35.     judge(s,x,y,num);  
  36.     //printf("%c\n",s[x]);  
  37.     if(num!=Inf)  
  38.     {  
  39.         now->date=num;  
  40.         return now;  
  41.     }  
  42.     int p=0,c1=-1,c2=-1;  
  43.     for(int i=x; i<y; i++)  
  44.         switch(s[i])  
  45.         {  
  46.             case '(':p++;break;  
  47.             case ')':p--;break;  
  48.             case '+':case '-':if(!p)c1=i;break;  
  49.             case '*':case '/':if(!p)c2=i;break;  
  50.         }  
  51.     if(c1<0)c1=c2;  
  52.     if(c1<0)return build(s,x+1,y-1);  
  53.     now->l=build(s,x,c1);  
  54.     now->r=build(s,c1+1,y);  
  55.     now->ch=s[c1];  
  56.     return now;  
  57. }  
  58. double dfs(tree *p)  
  59. {  
  60.     if(!p)return 0;  
  61.     if(p->l==p->r&&p->l==NULL)return p->date;  
  62.     switch (p->ch)  
  63.     {  
  64.         case '+':return p->date=dfs(p->l)+dfs(p->r);break;  
  65.         case '-':return p->date=dfs(p->l)-dfs(p->r);break;  
  66.         case '*':return p->date=dfs(p->l)*dfs(p->r);break;  
  67.         case '/':return p->date=dfs(p->l)/dfs(p->r);break;  
  68.     }  
  69.     return 0;  
  70. }  
  71. void dfs(tree *p,int choose)  
  72. {  
  73.     if(!p)return ;  
  74.     if(p->l==p->r&&p->l==NULL){printf(" %g",p->date);}  
  75.     if(!choose){printf("%c",p->ch);dfs(p->l,choose);dfs(p->r,choose);}  
  76.     else {  
  77.         dfs(p->l,choose);dfs(p->r,choose);printf("%c",p->ch);  
  78.     }  
  79. }  
  80. char s[1005];  
  81. int main()  
  82. {  
  83.     tree *root=NULL;  
  84.     while(gets(s)==NULL)  
  85.     {  
  86.         root=NULL;  
  87.         int len=strlen(s);  
  88.         root=build(s,0,len);  
  89.         double ans=dfs(root);  
  90.         puts("前缀表达式:");dfs(root,0);puts("");  
  91.         puts("后缀表达式:");dfs(root,1);puts("");  
  92.         printf("%s=%g\n",s,ans);  
  93.     }  
  94.     return 0;  
  95. }  

上面的不能计算5*-6这种,下面的进行了改正


[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<math.h>  
  4. #define Inf 1e9  
  5. struct tree  
  6. {  
  7.     double date;  
  8.     char ch;  
  9.     tree *l,*r;  
  10.     tree()  
  11.     {  
  12.         ch='\0';  
  13.         date=0;  
  14.         l=r=NULL;  
  15.     }  
  16. };  
  17. char st[1005];  
  18. double judge(char *s,int x,int y,double &n)  
  19. {  
  20.     double num=0;  
  21.     int i,ok=0;  
  22.     for(i=x; i<y; i++)  
  23.         if(s[i]>='0'&&s[i]<='9')  
  24.         {  
  25.             if(!ok)num=num*10+s[i]-'0';  
  26.             else num+=(s[i]-'0')*pow(10,ok-i);  
  27.         }  
  28.         else if(s[i]=='.'){ok=i;}  
  29.         else return 0;  
  30.     return n=num;  
  31. }  
  32. int is_operator(char c)  
  33. {  
  34.     if(c=='+'||c=='-'||c=='*'||c=='/')return 1;  
  35.     return 0;  
  36. }  
  37. tree *build(char *s,int x,int y)  
  38. {  
  39.     tree *now=new tree;  
  40.     double num=Inf;  
  41.     judge(s,x,y,num);  
  42.     //printf("%c\n",s[x]);  
  43.     if(num!=Inf)  
  44.     {  
  45.         now->date=num;  
  46.         return now;  
  47.     }  
  48.     int p=0,c1=-1,c2=-1;  
  49.     for(int i=x; i<y; i++)if(s[i]=='-'&&is_operator(s[i-1]))  
  50.         {  
  51.             int t=2;  
  52.             st[0]='(';  
  53.             st[1]='0';  
  54.             int k=0,ok=1;  
  55.             for(int j=i; j<y; j++)  
  56.             {  
  57.                 if(s[i]=='(')k++;  
  58.                 else if(s[i]==')')k--;  
  59.                 st[t++]=s[j];  
  60.                 if((ok&&j==y-1)||(!k&&is_operator(s[i+1])))  
  61.                 {  
  62.                     ok=0;  
  63.                     st[t++]=')';  
  64.                 }  
  65.             }  
  66.             s[t]='\0';  
  67.             memcpy(s+i,st,sizeof(st));  
  68.             i--;  
  69.             y+=3;  
  70.         }  
  71.         else  
  72.             switch(s[i])  
  73.             {  
  74.             case '(':p++;break;  
  75.             case ')':p--;break;  
  76.             case '+':  
  77.             case '-':if(!p)c1=i;break;  
  78.             case '*':case '/':if(!p)c2=i;break;  
  79.             }  
  80.     if(c1<0)c1=c2;  
  81.     if(c1<0)return build(s,x+1,y-1);  
  82.     now->l=build(s,x,c1);  
  83.     now->r=build(s,c1+1,y);  
  84.     now->ch=s[c1];  
  85.     return now;  
  86. }  
  87. double dfs(tree *p)  
  88. {  
  89.     if(!p)return 0;  
  90.     if(p->l==p->r&&p->l==NULL)return p->date;  
  91.     switch (p->ch)  
  92.     {  
  93.     case '+':  
  94.         return p->date=dfs(p->l)+dfs(p->r);  
  95.         break;  
  96.     case '-':  
  97.         return p->date=dfs(p->l)-dfs(p->r);  
  98.         break;  
  99.     case '*':  
  100.         return p->date=dfs(p->l)*dfs(p->r);  
  101.         break;  
  102.     case '/':  
  103.         return p->date=dfs(p->l)/dfs(p->r);  
  104.         break;  
  105.     }  
  106.     return 0;  
  107. }  
  108. void dfs(tree *p,int choose)  
  109. {  
  110.     if(!p)return ;  
  111.     if(p->l==p->r&&p->l==NULL)  
  112.     {  
  113.         printf(" %g",p->date);  
  114.     }  
  115.     if(!choose)  
  116.     {  
  117.         printf("%c",p->ch);  
  118.         dfs(p->l,choose);  
  119.         dfs(p->r,choose);  
  120.     }  
  121.     else  
  122.     {  
  123.         dfs(p->l,choose);  
  124.         dfs(p->r,choose);  
  125.         printf("%c",p->ch);  
  126.     }  
  127. }  
  128. char s[1005];  
  129. int main()  
  130. {  
  131.     tree *root=NULL;  
  132.     while(gets(s)!=NULL)  
  133.     {  
  134.         root=NULL;  
  135.         int len=strlen(s);  
  136.         root=build(s,0,len);  
  137.         double ans=dfs(root);  
  138.         puts("前缀表达式:");  
  139.         dfs(root,0);  
  140.         puts("");  
  141.         puts("后缀表达式:");  
  142.         dfs(root,1);  
  143.         puts("");  
  144.         printf("%s=%g\n",s,ans);  
  145.     }  
  146.     return 0;  
  147. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值