目前只能算单位数,可计算括号与加减乘除。
代码如下:
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=='