表达式计算--表达式树

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

代码如下:

 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=='
' || c=='') 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(")
");    //输出表达式树
91     ans = count(1);
92     printf("%d",ans);
93 }
原文地址:https://www.cnblogs.com/songer/p/5271406.html