1. 简单表达式求值算法
1. 作用:
- 求特殊表达式的值
- 特殊性:
- 数字都为一位整数
- 没有括号运算符
- 特殊性:
2. 实际算法梗概:
算法主要使用两个栈:
- 运算数栈,以下简称数栈
- 顺序存放运算数, 供运算符使用
- 运算符栈,以下简称符栈
- 顺序存放运算符(栈顶优先度>栈底优先度)
- 开始先无条件读取数字并压栈, 直到读取字符并压栈
- 持续读取数字和字符并进行压栈
- 试图叠罗汉一样把符栈叠得优先度越来越高
- 直到读取到不能再叠下去的运算符(即优先度小于符栈栈顶)
- 依次在数栈栈顶中取两个数与符栈栈顶一个字符进行结合
- 结合后的数压栈到数栈
- 类似消消乐, 直到符栈全部处理完(为空), 数栈只剩一个数(前面所有的数合并为一个数)
- 继续读取
- 继续叠罗汉
- 继续消消乐
- 直到读取完整个表达式
- 返回最后数栈仅剩的那个数
3. 从具体实例描述实际算法过程:
计算A/B^C+D*E
- 读
A, 压入数栈 - 读
/, 压入符栈 - 读
B, 压入数栈 - 读
^, 优先度高于/, 压入符栈 - 读
C, 压入数栈 - 读
+- 此时数栈和符栈的情况:
- 数栈: 栈顶→
[C,B,A] - 符栈: 栈顶→
[^,/]
- 数栈: 栈顶→
- 优先度低于符栈栈顶, 即
^- 从符栈顶取一个运算符, 即
^ - 从数栈顶取两个数, 即
C和B - 结合
B^C为新的数T(1), 压入数栈
- 从符栈顶取一个运算符, 即
- 此时数栈和符栈的情况:
- 数栈: 栈顶→
[T(1),A] - 符栈: 栈顶→
[/]
- 数栈: 栈顶→
- 优先度低于符栈栈顶, 即
/- 从符栈顶取一个运算符, 即
/ - 从数栈顶取两个数, 即
T(1)和A - 结合
A/T(1)为新的数T(2), 压入数栈
- 从符栈顶取一个运算符, 即
- 此时符栈为空
- 此时数栈和符栈的情况:
- 数栈: 栈顶→
[T(2)] - 符栈: 栈顶→
[]
- 数栈: 栈顶→
- 此时数栈和符栈的情况:
+入符栈
- 此时数栈和符栈的情况:
- 读
D, 压入数栈 - 读
*, 优先度高于+, 压入符栈 - 读
D, 压入数栈 - 此时数栈和符栈的情况:
- 数栈: 栈顶→
[E,D,T(2)] - 符栈: 栈顶→
[*,+]
- 数栈: 栈顶→
- 此时表达式全部读完
- 从符栈顶取一个运算符, 即
* - 从数栈顶取两个数, 即
E和D - 结合
D*E为新的数T(3), 压入数栈 -
- 此时数栈和符栈的情况:
- 数栈: 栈顶→
[T(3),T(2)] - 符栈: 栈顶→
[+]
- 数栈: 栈顶→
- 此时数栈和符栈的情况:
- 从符栈顶取一个运算符, 即
+ - 从数栈顶取两个数, 即
T(3)和T(2) - 结合
T(2)*T(3)为新的数T(4), 压入数栈 -
- 此时数栈和符栈的情况:
- 数栈: 栈顶→
[T(4)] - 符栈: 栈顶→
[]
- 数栈: 栈顶→
- 此时数栈和符栈的情况:
- 此时符栈为空
- 把数栈中唯一的
T(4)返回
- 从符栈顶取一个运算符, 即