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)
返回
- 从符栈顶取一个运算符, 即