如何利用栈实现表达式求值

本文介绍了如何利用栈实现中缀表达式求值,通过将中缀表达式转换为后缀表达式,简化计算过程。文中给出了计算思路和一个简单的例子,以及关键代码实现,但对表达式正确性的校验和处理的限制较多。
摘要由CSDN通过智能技术生成

前言

假如要你实现一个可以识别表达式的简易计算器,你会怎么实现?例如用户输入:

3 + 5 * (2 - 4)

可以直接得出计算结果:-7。对于人类来说,我们很容易计算出来,因为我们从左往右看,看到后面括号时,知道括号内的计算优先级最高,因此可以先计算括号内的,然后反过来计算乘法,最后计算加法,得到最终结果。

后缀表达式

而对于计算机来说,实际也可以采用类似的顺序,先记录存储3为a,然后存储5为b,计算2-4结果存入c,再然后计算b*c存储d,最终计算a+d得到最终结果。而这种计算过程的操作顺序可描述如下(把操作符号放在操作数后面):

3 5 2 4 - * +

这种记法叫做后缀或逆波兰记法(而我们平常见到的叫中缀记法),它的特点是不需要用括号就能表示出整个表达式哪部分运算先进行,也就是说不需要考虑优先级,这非常符合计算机的处理方式。这种记法很容易使用我们前面介绍的栈来求值,但是前提是需要将中缀表达式先转换为后缀表达式。对于这种转换,我们也可以使用前面介绍的《栈-C语言实现》或者将要介绍的树来完成,因篇幅有限,本文不准备介绍。

接下来将会介绍如何利用中缀表达式进行求值。

利用栈实现中缀表达式求值

前面也说到,所谓中缀表达式,就是我们能看到的正常表达式,中缀表达式求值,也就是直接对输入的表达式进行求值。为简单起见,我们这里假设只涉及加减乘除和小括号,并且操作数都是正整数,不涉及更加复杂的数据或运算。

计算思路:

  • 使用两个栈,stack0用于存储操作数,stack1用于存储操作符

  • 从左往右扫描,遇到操作数入栈stack0

  • 遇到操作符时,如果优先级低于或等于栈顶操作符优先级,则从stack1弹出两个元素进行计算,并压入stack0,继续与栈顶操作符的比较优先级

  • 如果遇到操作符高于栈顶操作符优先级,则直接入栈stack1

  • 遇到左括号,直接入栈stack1,遇到右括号,则直接出栈并计算,直到遇到左括号

上面的思路可能看起来不是很明确,我们举一个简单的例子,假如要对下面的表达式求值:

* (2 + 3 )* 8 + 5

我们从左往右开始扫描。首先遇到操作数‘6’,和操作符‘*’,分别入栈
stack0:

栈顶



6



stack1:

栈顶



*



继续往后扫描,遇到‘(’直接入栈,‘2’入栈,栈顶是左括号,’+‘入栈,‘3’入栈
stack0:



栈顶

6 2 3

stack1:



栈顶

* ( +

<
  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值