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

来源:互联网 发布:php 访问 编辑:程序博客网 时间:2024/04/28 16:17

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

[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. }  
0 0
原创粉丝点击