码迷,mamicode.com
首页 > 其他好文 > 详细

表达式计算--表达式树

时间:2016-03-13 11:23:24      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

目前只能算单位数,可计算括号与加减乘除。

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int maxn = 1000;
 5 int lch[maxn],rch[maxn];
 6 char op[maxn];
 7 int nc = 0,n;
 8 char s[1000];
 9 
10 int build_tree(char* s, int x , int y)
11 {
12     int c1 = -1,c2 = -1,p = 0;    //c1存储是否有+,-出现,c2存储*,/ 
13     int u;            //u存储节点编号 
14     if (y - x == 1)        //只能处理单位数字!!!
15     {
16         u = ++nc;
17         lch[u] = rch[u] = 0;
18         op[u] = s[x];
19         return u;
20     }        
21     for (int i = x; i<y; i++)
22     {
23         switch(s[i])
24         {
25             case (: p++; break;
26             case ): p--; break;
27             case +: case -: if (!p) c1 = i; break;
28             case *: case /: if (!p) c2 = i; break;
29             //p存储当前是否在括号内,如在括号内则不取当前符号 
30         }
31     }
32     if (c1<0) c1 = c2;
33     if (c1<0) return build_tree(s,x+1,y-1);
34     u = ++nc;
35     lch[u] = build_tree(s,x,c1);
36     rch[u] = build_tree(s,c1+1,y);
37     op[u] = s[c1];
38     return u;
39 }
40 
41 char getstring()        //字符串读入 
42 {
43     int i = -1;
44     char c = getchar(); 
45     do
46     {
47         if (c==\n || c==\0) break;
48         s[++i] = c;
49         c = getchar();
50     }while (1);
51     n = i+1;
52 }
53 
54 int count(int u)    //计算 
55 {
56     if (lch[u] == 0)
57     {
58         int num;
59         num = (int)op[u] - 0;            //只能处理单位数字!!
60         return num; 
61     }else
62     {
63         switch(op[u])
64         {
65             case *: return count(lch[u])*count(rch[u]);
66             case /: return count(lch[u])/count(rch[u]);
67             case +: return count(lch[u])+count(rch[u]);
68             case -: return count(lch[u])-count(rch[u]);
69         }
70     }
71 }
72 /*
73 int print(int u,int a)   //输出表达式树
74 {
75     int d = 0;
76     if (!u) return 0; 
77     if (a) 
78         printf("(%c",op[u]);
79     else printf(",%c",op[u]),d = 1; 
80     print(lch[u],1);
81     print(rch[u],0); 
82     if (d)    printf(")");
83 } 
84 */
85 int main()
86 {
87     int ans;
88     getstring(); 
89     build_tree(s,0,n);
90    //   print(1,1);        printf(")\n");    //输出表达式树
91     ans = count(1);
92     printf("%d",ans);
93 }

 

表达式计算--表达式树

标签:

原文地址:http://www.cnblogs.com/songer/p/5271406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!