栈的应用_简单表达式求值

这篇博客探讨了如何利用栈这一数据结构来求解简单表达式的值。通过介绍栈的基本运算,包括压栈、出栈等操作,详细阐述了解析表达式并计算其结果的过程。

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


栈的基本运算sqstack.cpp

#include "sqstack.cpp"                   //这行与下面那行都是sqstack.cpp文件中栈的基本运算,只是这行ElemType是char  
#include "sqstack1.cpp"                  //而这行文件ElemType是double型,为了区分,这行文件中sqstack类型和函数后面加1加以区分
#include <stdlib.h>
void trans(char *exp,char postexp[])     //把表达式exp转化为后缀表达式postexp
{	char e;
	SqStack *Optr;
	InitStack(Optr);
	int i=0;
	while(*exp!='\0')
	{	switch(*exp)
		{	case '(':
				Push(Optr,'(');
				exp++;
				break;
			case ')':
				Pop(Optr,e);
				while(e!='(')
				{	postexp[i++]=e;
					Pop(Optr,e);
				}
				exp++;
				break;
			case '+':
			case '-':
				while(!StackEmpty(Optr))
				{	GetTop(Optr,e);
					if(e!='(')
					{	postexp[i++]=e;
						Pop(Optr,e);
					}
					else
						break;
				}
				Push(Optr,*exp);
				exp++;
				break;
			case '*':
			case '/':
				while(!StackEmpty(Optr))
				{	GetTop(Optr,e);
					if(e=='*'||e=='/')
					{	postexp[i++]=e;
						Pop(Optr,e);
					}
					else
						break;
				}
				Push(Optr,*exp);
				exp++;
				break;
			default:
				while(*exp>='0'&&*exp<='9')
				{	postexp[i++]=*exp;
					exp++;
				}
				postexp[i++]='#';
		}
	}
	while(!StackEmpty(Optr))
	{	Pop(Optr,e);
		postexp[i++]=e;
	}
	postexp[i]='\0';
	DestroyStack(Optr);
}
double compvalue(char *postexp)     //后缀表达式求值 
{	double d,a,b,c,e;
	SqStack1 *Opnd;
	InitStack1(Opnd);
	while(*postexp!='\0')
	{	switch(*postexp)
		{	case '+':
				Pop1(Opnd,a);
				Pop1(Opnd,b);
				c=b+a;
				Push1(Opnd,c);
				break;
			case '-':
				Pop1(Opnd,a);
				Pop1(Opnd,b);
				c=b-a;
				Push1(Opnd,c);
				break;
			case '*':
				Pop1(Opnd,a);
				Pop1(Opnd,b);
				c=b*a;
				Push1(Opnd,c);
				break;
			case '/':
				Pop1(Opnd,a);
				Pop1(Opnd,b);
				if(a!=0)
				{	c=b/a;
					Push1(Opnd,c);
					break;
				}
				else
				{	printf("\n\t除零错误!\n");
					exit(0);
				}
				break;
			default:
				d=0;
				while(*postexp>='0'&&*postexp<='9')
				{	d=10*d+*postexp-'0';
					postexp++;
				}
				Push1(Opnd,d);
				break;
		}
		postexp++;
	}
	GetTop1(Opnd,e);
	DestroyStack1(Opnd);
	return e;
}
int main()
{	char exp[50];           //"(56-20)/(4+2)"
	char postexp[MaxSize];
	printf("请输入表达式:");
	scanf("%s",exp); 
	trans(exp,postexp);
	//printf("中缀表达式:%s\n",exp);
	//printf("后缀表达式:%s\n",postexp);
	printf("表达式的值:%g\n",compvalue(postexp));
	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值