表达式计算--表达式树

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

代码如下:

 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 }
时间: 2024-10-13 18:13:05

表达式计算--表达式树的相关文章

C# - 二叉树表达式计算

很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深嘛. 我喜欢逆过来贴代码~ 这是运行结果: cal() 是节点类里的计算方法,从根节点调用,递归所有子节点进行计算.Left,Right分别是左右子节点. 1 public double cal() 2 { 3 if (this.isDig==false) 4 { 5 return CAL(Fuha

前中后缀表达式以及表达式树

中缀表达式就是我们平时喜闻乐见的形式:二元运算符在中间,它的两个操作数在两侧: a + b * c + ( d * e + f ) * g 后缀和前缀表达式,顾名思义就是把运算符分别放在前面或者后面,注意没有括号,手工转换方法是按运算顺序添加括号,然后把相应的运算符置于相应的括号的前或后,如: ((a + ( b * c)) + (((d * e) + f) * g)) 放到前面有: +(+(a*(b c))*(+((*(d e))f)g)) 放到后面有: ((a(b c)*)+(((d e)*

ACM:树的变换,根据表达式建立表达式树

题目:输入一个表达式,建立一个表达式树! 分析:找到最后计算的运算符(它是整棵表达式树的根),然后递归处理! 在代码中,只有当p==0的时候,才考虑这个运算符,因为括号里的运算符一定不是最后计算的,应当忽略! 由于加减跟乘除都是左结合的,最后一个运算符才是最后计算的,所以用两个变量c1跟c2分别记录在括号外面的"最右"出现的加减号和乘除号. #include <iostream> #include <string> using namespace std; co

PHP 实现字符串表达式计算

什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执行动态的表达式,如给定一个含表达式的字符串变量并计算其结果,而表达式字符串是动态的,比如为客户A执行的表达式是 $orderCount >= 10,而为客户B执行的表达式是 $orderTotal >= 1000. 场景在哪儿?同一份程序具有完全通用性,但差异就其中一个表达式而已,那么我们需要将其

表达式计算

1 #include<iostream> 2 #include<string> 3 #include<cstdlib> 4 #include<cstring> 5 #include<iomanip> 6 #include<stack> 7 using namespace std; 8 9 #define OK 0 10 #define ERROR -1 11 #define OVERFLOW -1 12 #define OPSETSI

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如

Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

Vs2013在Linux开发中的应用(26):表达式计算

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 当VS调试时将鼠标移到一个变量上面的时候,VS将显示这个变量的值,实际上这个时候VS进行了表达式的计算,我们所需要做的,就是把这个过程转换为gdb的命令: Operation Description -enable-pretty-printing enable Python-based pretty-printing -var-create create a variable object -v

HDU 2424-Gary&#39;s Calculator(表达式计算+大数)

Gary's Calculator Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 950    Accepted Submission(s): 209 Problem Description Gary has finally decided to find a calculator to avoid making simple cal