表达式树的构建(详解)
来源:互联网 发布:java将string转成map 编辑:程序博客网 时间:2024/06/05 18:19
表达式树的建立:
1:思路:找到最后计算的运算符(即表达式树的根),然后递归处理。
2:代码:
const int maxn=1e4;int lch[maxn],rch[maxn];//每个节点左右儿子的编号char op[maxn];//储存运算符int nc=0;//记录节点数int build_tree(char s[],int x,int y){ int i,c1=-1,c2=-1,p=0; int u; if(y-x==1) //当仅有一个字符,建立单独节点 { u=++nc; lch[u]=rch[u]=0; op[u]=s[x]; return u; } //for循环扫描区间内的运算符,运用标志变量p //只有在括号外的表达式才会被c1,c2记录位置,而只有p==0时才会被记录 //所以被记录的前提就是该运算符不出现在括号内 for(i=x;i<y;i++) { switch(s[i]) { case '(': p++;break; case ')': p--;break; case '+': case '-': if(!p) c1=i;break; case '*': case '/': if(!p) c2=i;break; } } if(c1<0) c1=c2; if(c1<0) return build_tree(s,x+1,y-1);//当c1,c2都未改变时,说明为括号 u=++nc; //递归建树 lch[u]=build_tree(s,x,c1); rch[u]=build_tree(s,c1+1,y); op[u]=s[c1]; return u;}
3: 细节:
op里存的实际是输入字符串的每一个字符,而lch,rch数组存的是第i个节点左右儿子的节点编号;
下面加了一段代码:
int main(){ char tt[100]; while(scanf("%s",tt)!=EOF) { int len=strlen(tt); build_tree(tt,0,len); for(int i=0;i<=nc;i++) { printf("节点 %d: 运算符: %c\n",i,op[i]); printf(" 左儿子 : %d\n",lch[i]); printf(" 右儿子 : %d\n",rch[i]); } } return 0;}
具体看下面的截图:
0 0
- 表达式树的构建(详解)
- 表达式树的构建
- linq 表达式树的构建 Expression.Lambda
- 构建表达式树
- 构建表达式树
- 数据结构:简单算数表达式二叉树的构建和求值
- 动态构建OrderBy的Lambda表达式
- 第六章 正则表达式的构建
- EL表达式的详解
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- J2EE Oa项目上传服务器出现的乱码解决过程
- 【WCF系列一】WCF入门教程(图文) VS2012
- poj - 1163 - The Triangle(dp)
- 数组指针char *lineptr[MAXLINE]
- 关于view 的执行计划
- 表达式树的构建(详解)
- iOS微信支付
- android权限大全[转]
- Hduoj2049 【错排】【水题】
- Android之SurfaceView学习(一)
- handle bar helper -- if extension
- Linux入门笔记(1)-- 权限Chmod
- 编程学习网站
- 《浪潮之巅》12 短暂的春秋——与机会失之交臂的公司