堆栈-中缀表达式求值-分析并附完整源代码

本文介绍了如何使用堆栈处理中缀表达式的运算优先级问题,通过分析运算规则,提出利用堆栈计算中缀表达式值的方法。在遇到不同运算符时,根据优先级决定是否进行计算。对于复杂情况如括号表达式,文章解释了如何正确处理括号内的计算。堆栈在计算过程中的作用关键,可以使用自定义数据结构或C++的STL库实现。

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

中缀表达式,顾名思义,可以理解成操作符夹在操作数中间的表达式,也是人类广泛使用的表达式形式,因为简单,粗暴,通俗,易懂,然而...电脑并不懂怎么处理这种算式啊,(电脑:臣妾做不到啊),因为中缀表达式中的运算符具有优先级,任何一个上过小学二年级的人都不该把1+2*3算成9,因为都知道乘除号的优先级是比加减号高的,然后还有括号里的表达式最先计算的规则,所以括号在某些情况下优先级比乘除号还高,比如1*(2+3),这里虽然乘号比加号优先级高,但是因为括号神队友给加号加了个buff,所以加号获得了强化...先参与计算了。

那么,如何解决表达式里运算符的优先级呢,查表是一个比较容易想到的思路,建立一个二维数组,每个符号分别对应一个角标,然后二维数组中的元素(例如是int型),那可以把1记为操作符a>b,0记为相等,-1记为a<b。但这里给出另外一种方案,用函数来判断,两种方案都比较容易实现。

因为计算中缀表达式的值要使用到先入后出的数据结构,所以需要用到堆栈,堆栈可以自己构造一个简单的数据结构,也可以使用C++的STL库。

然后简要分析一下,理一理思路:

如果给出了算式3+5,从头开始扫描,扫描到第一个字符,3,判断是数字,当前操作符栈为空,无法操作,所以只能进入操作数栈,然后继续向后扫描,这次扫描到的字符是+,是操作符,但是操作数栈只有一个,也没法操作,扔进操作符栈,继续扫描,扫描到了5,是数字,扔进操作数栈,同时发现已经没有下一个元素了,表达式已经扫描到了句尾,所以需要计算,这时取出操作数栈里的两个元素,取出操作符栈里的+号,计算出的值存进操作数栈,判断发现已经读到句尾,返回操作数栈顶元素。

现在难度加大,如果给出,3+5*1,从头开始扫描,直到扫描到5,和上述操作都相同,但是扫描到5的时候读下一个字符不是空白,即不是句尾,所以不能急于计算3+5,扫描到乘号的时候,需要看一下操作符栈顶元素优先级,是加号,比现在的操作符低,抛开代码,按照常识,3+5*这个算式肯定不能算的,必须还要看下一个数是什么,所以这里的操作应当是把乘号入栈,而不是取出加号计算3+5。

if (i < j)//栈外操作符优先级高
{
	OPERATOR.push(temp);//操作符入栈
}
继续向下扫描,扫到了数字1,加入操作数,而且读到了句尾,这时乘号两边都有数了,一本满足,所以取出操作数栈最顶上的两个元素1和5,取出操作符栈顶的*,计算1*5得到了5,加入堆栈。

1  
5 *
3 +
现在堆栈情况变成了:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值