表达式计算(中缀表达式转后缀前缀表达式)

2024-09-02 18:38

本文主要是介绍表达式计算(中缀表达式转后缀前缀表达式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给出一个由加减乘除和括号构成的表达式计算表达式的值和表达式的前缀和后缀表达式

#include<stdio.h>
#include<string.h>
#include<math.h>
#define Inf 1e9
struct tree
{double date;char ch;tree *l,*r;tree(){ch='\0';date=0;l=r=NULL;}
};
double judge(char *s,int x,int y,double &n)
{double num=0;int i,ok=0;for(i=x; i<y; i++)if(s[i]>='0'&&s[i]<='9'){if(!ok)num=num*10+s[i]-'0';else num+=(s[i]-'0')*pow(10,ok-i);}else if(s[i]=='.'){ok=i;}else return 0;return n=num;
}
tree *build(char *s,int x,int y)
{tree *now=new tree;double num=Inf;judge(s,x,y,num);//printf("%c\n",s[x]);if(num!=Inf){now->date=num;return now;}int p=0,c1=-1,c2=-1;for(int 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(s,x+1,y-1);now->l=build(s,x,c1);now->r=build(s,c1+1,y);now->ch=s[c1];return now;
}
double dfs(tree *p)
{if(!p)return 0;if(p->l==p->r&&p->l==NULL)return p->date;switch (p->ch){case '+':return p->date=dfs(p->l)+dfs(p->r);break;case '-':return p->date=dfs(p->l)-dfs(p->r);break;case '*':return p->date=dfs(p->l)*dfs(p->r);break;case '/':return p->date=dfs(p->l)/dfs(p->r);break;}return 0;
}
void dfs(tree *p,int choose)
{if(!p)return ;if(p->l==p->r&&p->l==NULL){printf(" %g",p->date);}if(!choose){printf("%c",p->ch);dfs(p->l,choose);dfs(p->r,choose);}else {dfs(p->l,choose);dfs(p->r,choose);printf("%c",p->ch);}
}
char s[1005];
int main()
{tree *root=NULL;while(gets(s)==NULL){root=NULL;int len=strlen(s);root=build(s,0,len);double ans=dfs(root);puts("前缀表达式:");dfs(root,0);puts("");puts("后缀表达式:");dfs(root,1);puts("");printf("%s=%g\n",s,ans);}return 0;
}

上面的不能计算5*-6这种,下面的进行了改正


#include<stdio.h>
#include<string.h>
#include<math.h>
#define Inf 1e9
struct tree
{double date;char ch;tree *l,*r;tree(){ch='\0';date=0;l=r=NULL;}
};
char st[1005];
double judge(char *s,int x,int y,double &n)
{double num=0;int i,ok=0;for(i=x; i<y; i++)if(s[i]>='0'&&s[i]<='9'){if(!ok)num=num*10+s[i]-'0';else num+=(s[i]-'0')*pow(10,ok-i);}else if(s[i]=='.'){ok=i;}else return 0;return n=num;
}
int is_operator(char c)
{if(c=='+'||c=='-'||c=='*'||c=='/')return 1;return 0;
}
tree *build(char *s,int x,int y)
{tree *now=new tree;double num=Inf;judge(s,x,y,num);//printf("%c\n",s[x]);if(num!=Inf){now->date=num;return now;}int p=0,c1=-1,c2=-1;for(int i=x; i<y; i++)if(s[i]=='-'&&is_operator(s[i-1])){int t=2;st[0]='(';st[1]='0';int k=0,ok=1;for(int j=i; j<y; j++){if(s[i]=='(')k++;else if(s[i]==')')k--;st[t++]=s[j];if((ok&&j==y-1)||(!k&&is_operator(s[i+1]))){ok=0;st[t++]=')';}}s[t]='\0';memcpy(s+i,st,sizeof(st));i--;y+=3;}elseswitch(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(s,x+1,y-1);now->l=build(s,x,c1);now->r=build(s,c1+1,y);now->ch=s[c1];return now;
}
double dfs(tree *p)
{if(!p)return 0;if(p->l==p->r&&p->l==NULL)return p->date;switch (p->ch){case '+':return p->date=dfs(p->l)+dfs(p->r);break;case '-':return p->date=dfs(p->l)-dfs(p->r);break;case '*':return p->date=dfs(p->l)*dfs(p->r);break;case '/':return p->date=dfs(p->l)/dfs(p->r);break;}return 0;
}
void dfs(tree *p,int choose)
{if(!p)return ;if(p->l==p->r&&p->l==NULL){printf(" %g",p->date);}if(!choose){printf("%c",p->ch);dfs(p->l,choose);dfs(p->r,choose);}else{dfs(p->l,choose);dfs(p->r,choose);printf("%c",p->ch);}
}
char s[1005];
int main()
{tree *root=NULL;while(gets(s)!=NULL){root=NULL;int len=strlen(s);root=build(s,0,len);double ans=dfs(root);puts("前缀表达式:");dfs(root,0);puts("");puts("后缀表达式:");dfs(root,1);puts("");printf("%s=%g\n",s,ans);}return 0;
}



这篇关于表达式计算(中缀表达式转后缀前缀表达式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130750

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa