用二叉树实现表达式中缀式变后缀式并求值

本文介绍了一种使用C语言实现的数学表达式解析方法,通过构建解析树来计算复杂数学表达式的值。该方法首先将输入字符串转换为一系列节点,每个节点包含数值或运算符,并通过特定规则构建树状结构。最后,通过遍历解析树完成计算。
部署运行你感兴趣的模型镜像
#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;
}

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值