如何用栈计算一个算术表达式的值?
2016-08-28 11:13
197 查看
来源于算法(第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+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个运算符(+-×÷)优先级来运算
顺便一提,可以把这种解析过程看成是对这个表达式树的解析,那么求值就是对这棵多叉树进行后序遍历(左右根)
相关文章推荐
- 数据结构::如何计算后缀表达式--栈的一个小应用
- 三目表达式如何省略一个表达式
- 如何用一个加号计算三个数的和
- php如何计算一个字符串的每个字符出现的次数
- 数据结构之应用"栈(Stack)"实现: 解析算术表达式及计算
- 请问如何用正则表达式检查一个输入值,输入值可以为负数,0,正数,小数点后面可以最多有四位?
- 计算一个表达式的值
- 从控制台输入一个二元表达式 并计算其结果
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 使用栈完成算术表达式的计算
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 如何设计一个实时流计算系统
- 栈的基本操作及如何判断一个表达式中的左右括号是否匹配
- 如何MFC实现计算一个文件夹的大小
- 杂:表达式计算顺序,参数传递顺序,typedef和define一个区别
- JAVA内存使用--如何计算一个Java对象占用的字节数
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 一个可以计算表达式的计算器
- 如何计算一个字符串里相同字符的个数
- 如何计算字符串表达式