数据结构4——链栈——表达式求值

本文介绍了一种使用链栈解析和计算后缀表达式的方法,实现了对负数、多位数的支持,通过构建链表存储表达式元素,并利用栈进行运算符和操作数的匹配计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构4——链栈——表达式求值

今天我们用链栈解决表达式求值的问题,首先表达式分为前缀,中缀,后缀表达式,日常生活里我们写的都是中缀表达式,这里我们变后缀的代码不再给出,输入一个后缀的表达式,求表达式的值。代码可以实现,负数、多位数,小括号,小数点暂不可实现,全是int量,但需要自行输入后缀表达式输入。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int elmtype;
typedef struct LinkedStackNode{
	elmtype data1;
	elmtype data3;
	char data2;
	struct LinkedStackNode *next;
}LinkedStackNode,*LinkedStack;
LinkedStack top;
LinkedStack init();
int push(LinkedStack top,elmtype x);
int pop(LinkedStack top,elmtype *x);
int main()
{
	char p[100];
	int i=0,x1,x2,k,m=0,n=0,j=0;
	LinkedStack head,tail,s,q,r;
	printf("请输入需要计算的表达式\n");
	s=init();
	head=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
	tail=head;
	head->next=NULL;
	gets(p);
	k=strlen(p);
	while(i<k-1)
	{
		if(p[i]==' ')
		{  
		if(p[i-1]>='0'&&p[i-1]<='9')
		{
			q=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
			if(p[j]=='-'&&p[j+1]>='0'&&p[j+1]<='9')
			{n=n+1;
				for(;n<i;n++){
						m=m*10+(p[n]-48);
					}
					m=-m;
			}
			else
			for(;n<i;n++){
						m=m*10+(p[n]-48);
					}
			q->data1=m;
			q->data3=0;
			q->next=NULL;
			tail->next=q;
			tail=q;
		}
		else
		{
			q=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
			q->data2=p[i-1];
			q->data3=1;
			q->next=NULL;
			tail->next=q;
			tail=q;
		}n=i+1;m=0;j=n;
		}
		i++;
	}
	q=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
	q->data2=p[k-1];
	q->data3=1;
	q->next=NULL;
	tail->next=q;
	r=head->next;
	while(r)
	{
		if(r->data3==0)
		push(s,r->data1);
		else if(r->data3==1)
		{
			pop(s,&x2);
			pop(s,&x1);
			if(r->data2=='+')
			{
				x1=x1+x2;
				push(s,x1);
			}
			if(r->data2=='-')
			{
				x1=x1-x2;
				push(s,x1);
			}
			if(r->data2=='*')
			{
				x1=x1*x2;
				push(s,x1);
			}
			if(r->data2=='/')
			{
				x1=x1/x2;
				push(s,x1);
			}
		}
		r=r->next;
	}
	printf("结果为:%d",s->next->data1);
	return 1;
}
LinkedStack init()
{
	LinkedStack top;
	top=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
	if(top!=NULL)
	top->next=NULL;
	return top;
}
int push(LinkedStack top,elmtype x)
{
	LinkedStackNode *node;
	node=(LinkedStackNode *)malloc(sizeof(LinkedStackNode));
	if(node==NULL)
	return 0;
	else
	{
		node->data1=x;
		node->next=top->next;
		top->next=node;
		return 1;
	}
}
int pop(LinkedStack top,elmtype *x)
{
	LinkedStackNode *node;
	if(top->next==NULL)
	return 0;
	else
	{
		node=top->next;
		*x=node->data1;
		top->next=node->next;
		free(node);
		return 1;
	}
}

样例

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

航霸霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值