表达式建树

 //用数组实现树 1 #include<iostream>
 2 #include<ctype.h>
 3 #include<cstring>
 4 #define N 10000
 5 #define optd 1
 6 #define optr 2
 7 using namespace std;
 8 int treeL[N], treeR[N];
 9 class node
10 {
11 public:
12    int flag;//区分当前节点是操作符还是操作数
13    double k;
14    char ch;
15 };
16
17 node opt[N];
18 int nodeN;
19 char formula[1000];
20
21 int buildTree(int ld, int rd)
22 {
23    int i;
24    for(i=ld; i<rd; ++i)
25      if(!isdigit(formula[i]))
26        break;
27    if(i>=rd)//最后全部为数字的时候
28    {
29        ++nodeN;
30        opt[nodeN].flag=optd;
31        sscanf(formula+ld, "%lf", &opt[nodeN].k);
32        treeL[nodeN]=treeR[nodeN]=0;//末端节点没有左右孩子
33        return nodeN;//返回当前所建节点编号
34    }
35    int pAS=-1, pMD=-1;//分别表示加减号, 乘除号所在的位置
36    int paren=0;//记录左括弧相对于右括弧出现的数目
37    for(i=ld; i<rd; ++i)
38    {
39       switch(formula[i])
40       {
41          case ‘(‘: ++paren;  break;
42          case ‘)‘: --paren;  break;
43
44          //最后计算的运算符一定是在括弧的外边,不会包含在括弧里边
45          case ‘+‘:
46          case ‘-‘:
47                    if(paren==0)   pAS=i;
48                    break;
49          case ‘*‘:
50          case ‘/‘:
51                if(paren==0) pMD=i;
52                    break;
53       }
54    }
55    if(pAS<0)  pAS=pMD;
56    if(pAS<0) //说明没有找到括弧外边的运算符,则脱掉一对括弧重新寻找
57      return buildTree(ld+1, rd-1);
58    int u=++nodeN;
59    opt[u].flag=optr;//表示存储操作符
60    opt[u].ch=formula[pAS];
61    treeL[u]=buildTree(ld, pAS);
62    treeR[u]=buildTree(pAS+1, rd);
63    return u;
64 }
65
66 void printTree(int cur)//中序输出表达式树
67 {
68    if(cur)//非末端节点
69    {
70       printTree(treeL[cur]);
71       if(opt[cur].flag==optd)
72         cout<<opt[cur].k<<" ";
73       else
74         cout<<opt[cur].ch<<" ";
75       printTree(treeR[cur]);
76    }
77 }
78
79 int main()
80 {
81    while(cin>>formula)
82    {
83       buildTree(0, strlen(formula));
84       printTree(1);
85    }
86    return 0;
87 } 
 //用链表实现树 1 #include<iostream>
 2 #include<ctype.h>
 3 #include<cstring>
 4 #define N 10000
 5 #define optd 1
 6 #define optr 2
 7 using namespace std;
 8
 9 class node
10 {
11 public:
12    node *lchild, *rchild;
13    int flag;//区分当前节点是操作符还是操作数
14    double k;
15    char ch;
16 };
17
18 char formula[1000];
19
20 void buildTree(node* &T, int ld, int rd)
21 {
22    int i;
23    for(i=ld; i<rd; ++i)
24      if(!isdigit(formula[i]))
25        break;
26    if(i>=rd)//最后全部为数字的时候
27    {
28        T=new node();
29        T->flag=optd;
30        sscanf(formula+ld, "%lf", &T->k);
31        return ;
32    }
33    int pAS=-1, pMD=-1;//分别表示加减号, 乘除号所在的位置
34    int paren=0;//记录左括弧相对于右括弧出现的数目
35    for(i=ld; i<rd; ++i)
36    {
37       switch(formula[i])
38       {
39          case ‘(‘: ++paren;  break;
40          case ‘)‘: --paren;  break;
41
42          //最后计算的运算符一定是在括弧的外边,不会包含在括弧里边
43          case ‘+‘:
44          case ‘-‘:
45                    if(paren==0)   pAS=i;
46                    break;
47          case ‘*‘:
48          case ‘/‘:
49                if(paren==0) pMD=i;
50                    break;
51       }
52    }
53    if(pAS<0)  pAS=pMD;
54    if(pAS<0) //说明没有找到括弧外边的运算符,则脱掉一对括弧重新寻找
55      return buildTree(T, ld+1, rd-1);
56    T=new node();
57    T->flag=optr;//表示存储操作符
58    T->ch=formula[pAS];
59    buildTree(T->lchild, ld, pAS);
60    buildTree(T->rchild, pAS+1, rd);
61 }
62
63 void printTree(node *T)//中序输出表达式树
64 {
65    if(T)//非末端节点
66    {
67       printTree(T->lchild);
68       if(T->flag==optd)
69         cout<<T->k<<" ";
70       else
71         cout<<T->ch<<" ";
72       printTree(T->rchild);
73    }
74 }
75
76 int main()
77 {
78    while(cin>>formula)
79    {
80       node *T=NULL;
81       buildTree(T, 0, strlen(formula));
82       printTree(T);
83    }
84    return 0;
85 } 

表达式建树

时间: 2024-10-03 14:46:10

表达式建树的相关文章

二叉树表达式计算(2)

/*学号:2014329620069  姓名:张卓鹏 班级:14计科2*/#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<stack>#include<iostream>#include<string>#include<string.h>#include<math.h>#include<sstream>usin

结对项目——四则运算题目生成器

一.GitHub项目地址 : https://github.com/OurPrograming/Exercises 结对项目成员:软三 陈纪禧(3118005043).软三 程伟杰(3118005045) 二.PSP预计时间: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划  60 · Estimate · 估计这个任务需要多少时间 60 Development 开发 1680 · Analysis ·

转载:C#特性-表达式树

原文地址:http://www.cnblogs.com/tianfan/ 表达式树基础 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通的LINQ知识便可以轻松理解本文. 表达式树提供一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是非常有价值的.尤其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 但是我在这里颠倒顺序,在文章最后你很容易发现为

C#特性-表达式树

表达式树ExpressionTree 表达式树基础 转载需注明出处:http://www.cnblogs.com/tianfan/ 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通的LINQ知识便可以轻松理解本文. 表达式树提供一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是非常有价值的.尤其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 但

表达式树ExpressionTree

表达式树基础 转载需注明出处:http://www.cnblogs.com/tianfan/ 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通的LINQ知识便可以轻松理解本文. 表达式树提供一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是非常有价值的.尤其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 但是我在这里颠倒顺序,在文章最后你很容易

C语法归约之表达式(3)

1.概要 前三篇博文(0,1,2)主要讨论是声明和定义的相关语法归约.从这篇文字开始,将开始进行有效的计算,涉及表达式和语句. 首先,表达式和语句这两个概念是不同的,表达式是没有分号(;)的,而表达式+:构成语句.但这不是语句的全部,语句还可以是跳转,迭代,标签语句等等(见图片C语句文法图)!打个比喻来说吧--就是蛋和鸡的关系!当然不是那个悖论,而是表达式是蛋,孵化是分号,鸡是语句.蛋孵化成鸡.鸡肚子里可以有蛋!嘎嘎!二者区别必须明白.不能混为一谈! 在C语言中,如果单纯就表达式计算而言,表达式

NOIP2011pj表达式的值[树形DP 笛卡尔树]

题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算. 现给定一个未完成的表达式,例如+(*_),请你在横线处填入数字0 或者1 ,请问有多少种填法可以使得表达式的值为0 . 输入输出格式 输入格式: 输入文件名为exp.in ,共 2 行. 第1 行为一个整数 L,表示给定的表达式中除去横线外的运

UVa11234 表达式

题意:题目意思是给出后缀表达式,可以通过栈来计算表达式的值,即转化为中缀表达式.然后如果现在不用栈,而是用队列来操作,即每遇到一操作符时,进行两次pop和一次push.(这里注意,先pop出来的作为第二操作数,操作符假设是不满足交换律和结合律的)因为队列的pop和push,与栈的不同么,所以,问队列的输入应该是怎样的,才能和给定的输入用栈来计算,所得值相同.(即转化为相同的中缀表达式) 思路:先转为表达式树,然后可以看到用队列的方式即为层次遍历(队列实现)这棵树,然后将值逆序输出. 这里树的链式

表达式树-理解与进阶

刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通的LINQ知识便可以轻松理解本文. 表达式树提供一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是非常有价值的.尤其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 但是我在这里颠倒顺序,在文章最后你很容易发现为什么将代码转换到数据中去很有用.首先我需要提供一点背景知识.让我们开始看看相关的创建表达