如何用栈计算一个算术表达式的值?

本文介绍了一种使用栈来解析并计算算术表达式的算法。该算法通过递归分解表达式,并根据运算符的优先级进行计算。具体包括如何设定运算符的优先级、如何利用栈进行操作数与运算符的匹配计算。

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

来源于算法(第4版)中用栈来求算术表达式的值的思考

例如

  • 1+2×(3+4)

基本思路

  • 括号内的式子作为子表达式,递归的分解为普通表达式
  • 普通表达式只有2个优先级,+-为0,×÷为0.5
  • 进入括号时,括号对应的这一层运算符的优先级基础值赋值为左括号左边一个运算符的优先级+1
  • 运算符的优先级=括号层数base+4个运算符(+-×÷)自身的优先级offset
设初始优先级为0,那么,
第1个+的优先级为0+0,
×的优先级为0+0.5,
第2个+的优先级为1+0,

在确定优先级之后,可以想一想我们在人工计算表达式值的时候是怎么算的
(思考过程暂时略过)
首先把数字和运算符压栈,直到栈中有1个运算符为止,记此运算符为sp-1,此时再看下一个运算符sp+1
如果sp-1的优先级比sp+1的大,那么可以抢先运算(把栈顶的1个运算符和2个操作数进行计算,求出结果,然后弹出栈顶的3个元素,压入结果),而不用管之后的其他运算符的优先级

说白了,就是先把遇到的第一个右括号那一层的表达式先求值,而括号内按照4个运算符(+-×÷)优先级来运算

顺便一提,可以把这种解析过程看成是对这个表达式树的解析,那么求值就是对这棵多叉树进行后序遍历(左右根)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值