#include<stdio.h>
#include<string.h>
char ch[1010];
struct node{
double data;
int start;
int finish;
int father;
int left;
int right;
}m[1010];
int mark[1010];
int len;
void Transformation()
{
int i,j=0;
int s,f;
double d=0;
s=f=-1;
ch[len-1]=')';
for(i=0;i<len;i++)
{
if(ch[i]<='9'&&ch[i]>='0')
{
if(s==-1)
{s=f=i;d=d*10+ch[i]-'0';}
else {f++;d=d*10+ch[i]-'0';}
}
else
{
if(s!=-1)
{
m[j].start=s;m[j].finish=f;m[j].data=d;
j++;
}
s=f=-1;
m[j].start=m[j].finish=i;
j++;
d=0;
}
}
}
int findroot(int root)
{
if(m[root].father!=root)
return findroot(m[root].father);
return m[root].father;
}
void merge(int i)
{
int j;
j=findroot(i-1);
m[i].left=j;m[j].father=i;
j=findroot(i+1);
m[i].right=j;m[j].father=i;
}
void createtree(int s)
{
int i;
int f;
int ms,mf;
for(i=s;i<len;i++)
{
ms=m[i].start;mf=m[i].finish;
if(ms==mf&&ch[ms]=='('&&mark[i]==1)
{
mark[i]=0;
m[i].father=i+1;m[i+1].left=i;
createtree(i+1);
}
if(ms==mf&&ch[ms]==')'&&mark[i]==1)
{
mark[i]=0;
m[i].father=i-1;m[i-1].right=i;
f=i;break;
}
}
for(i=s;i<f;i++)
{
ms=m[i].start;mf=m[i].finish;
if(ms==mf&&(ch[ms]=='*'||ch[ms]=='/')&&mark[i]==1)
{mark[i]=0;merge(i);}
}
for(i=s;i<f;i++)
{
ms=m[i].start;mf=m[i].finish;
if(ms==mf&&(ch[ms]=='+'||ch[ms]=='-')&&mark[i]==1)
{mark[i]=0;merge(i);}
}
}
double output(int root)
{
double l=0,r=0;
if(m[root].left!=-1)
l=output(m[root].left);
if(m[root].right!=-1)
r=output(m[root].right);
int ms=m[root].start;
int mf=m[root].finish;
if(ms==mf&&(ch[ms]=='('||ch[ms]==')'))
return 0;
if(ms==mf&&ch[ms]>'9'||ch[ms]<'0')
{
printf("%c",ch[ms]);
switch(ch[ms])
{
case '+':{return l+r;}
case '-':{return l-r;}
case '*':{return l*r;}
case '/':{return l/r;}
}
}
else {printf("%d",(int)m[root].data);return m[root].data;}
}
int main()
{
int T;
int k;
int i;
printf("请输入要计算的表达式个数:\n");
scanf("%d",&T);
while(T--)
{
printf("请输入表达式,以=号结束\n");
scanf("%s",ch);
len=strlen(ch);
for(i=0;i<=len;i++)
{
m[i].father=i;
m[i].left=-1;m[i].right=-1;
m[i].data=0;
mark[i]=1;
}
Transformation();
createtree(0);
k=findroot(0);
printf("=\n%.2f\n",output(k));
}
return 0;
}用二叉树实现表达式中缀式变后缀式并求值
最新推荐文章于 2024-05-07 14:35:27 发布
本文介绍了一种使用C语言实现的数学表达式解析方法,通过构建解析树来计算复杂数学表达式的值。该方法首先将输入字符串转换为一系列节点,每个节点包含数值或运算符,并通过特定规则构建树状结构。最后,通过遍历解析树完成计算。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
Stable-Diffusion-3.5
图片生成
Stable-Diffusion
Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率
1826

被折叠的 条评论
为什么被折叠?



