表达式建树
表达式
2023-09-14 08:57:54 时间
sscanf(formula+ld, "%lf", opt[nodeN].k);
treeL[nodeN]=treeR[nodeN]=0;//末端节点没有左右孩子
return nodeN;//返回当前所建节点编号
int pAS=-1, pMD=-1;//分别表示加减号, 乘除号所在的位置
int paren=0;//记录左括弧相对于右括弧出现的数目
for(i=ld; i ++i)
switch(formula[i])
case (: ++paren; break;
case ): --paren; break;
//最后计算的运算符一定是在括弧的外边,不会包含在括弧里边
case +:
case -:
if(paren==0) pAS=i;
break;
case *:
case /:
if(paren==0) pMD=i;
break;
if(pAS 0) pAS=pMD;
if(pAS 0) //说明没有找到括弧外边的运算符,则脱掉一对括弧重新寻找
return buildTree(ld+1, rd-1);
int u=++nodeN;
opt[u].flag=optr;//表示存储操作符
opt[u].ch=formula[pAS];
treeL[u]=buildTree(ld, pAS);
treeR[u]=buildTree(pAS+1, rd);
return u;
void printTree(int cur)//中序输出表达式树
if(cur)//非末端节点
printTree(treeL[cur]);
if(opt[cur].flag==optd)
cout opt[cur].k " ";
else
cout opt[cur].ch " ";
printTree(treeR[cur]);
int main()
while(cin formula)
buildTree(0, strlen(formula));
printTree(1);
return 0;
//用链表实现树
#include iostream
#include ctype.h
#include cstring
#define N 10000
#define optd 1
#define optr 2
using namespace std;
class node
public:
node *lchild, *rchild;
int flag;//区分当前节点是操作符还是操作数
double k;
char ch;
char formula[1000];
void buildTree(node* T, int ld, int rd)
int i;
for(i=ld; i ++i)
if(!isdigit(formula[i]))
break;
if(i =rd)//最后全部为数字的时候
T=new node();
T- flag=optd;
sscanf(formula+ld, "%lf", T-
return ;
int pAS=-1, pMD=-1;//分别表示加减号, 乘除号所在的位置
int paren=0;//记录左括弧相对于右括弧出现的数目
for(i=ld; i ++i)
switch(formula[i])
case (: ++paren; break;
case ): --paren; break;
//最后计算的运算符一定是在括弧的外边,不会包含在括弧里边
case +:
case -:
if(paren==0) pAS=i;
break;
case *:
case /:
if(paren==0) pMD=i;
break;
if(pAS 0) pAS=pMD;
if(pAS 0) //说明没有找到括弧外边的运算符,则脱掉一对括弧重新寻找
return buildTree(T, ld+1, rd-1);
T=new node();
T- flag=optr;//表示存储操作符
T- ch=formula[pAS];
buildTree(T- lchild, ld, pAS);
buildTree(T- rchild, pAS+1, rd);
void printTree(node *T)//中序输出表达式树
if(T)//非末端节点
printTree(T- lchild);
if(T- flag==optd)
cout T- k " ";
else
cout T- ch " ";
printTree(T- rchild);
int main()
while(cin formula)
node *T=NULL;
buildTree(T, 0, strlen(formula));
printTree(T);
return 0;
}
栈与队列——150. 逆波兰表达式求值 本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
栈与队列——150. 逆波兰表达式求值 本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
相关文章
- SAP UI5 第二代表达式语言的一些特性介绍
- 中缀表达式转换为后缀表达式(逆波兰表达式)并对其求值
- 【说站】java中Lamdba表达式的用法整理
- C/C++开发基础——lambda表达式与std::bind闭包
- 【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
- MySQL表达式:实现数据库更强大的功能(mysqlexpr)
- EL表达式在JS中使用时有无双引号的区别详解编程语言
- C++11 Lambda表达式(匿名函数)详解
- JS表达式语句和声明语句
- 给Oracle的in语句表达式提速技巧与实践(oracle优化in语句)
- 解析Tomcat6、7在EL表达式解析时存在的一个Bug
- c#反射表达式树模糊搜索示例