类似于 1*2-3+4-(5-6)-2/4 的式子,我们称为算术表达式。下面我们利用栈这种数据结构来解析它,即用栈来辅助计算算术表达式。
首先我们得明确计算规则:
- 先左后右:从左算到右
- 先乘除,后加减
- 先括号内,后括号外
原理:
- 使用两个栈来存储读入的字符:数字栈和符号栈
- 读入数字,则压入数字栈
- 读入符号,则把当前符号栈顶的符号与读入的符号进行优先级比较。若当前符号栈顶符号的优先级小,则继续把符号压入符号栈;若当前读入符号的优先级小,则数字栈依次出栈两个数,加上符号栈顶的符号,构成一算术表达式,通过计算得出结果,把结果压入数字栈。
- 当读入界限符或符号栈弹出界限符,如#,运算结束,数字栈弹栈,即最后的表达式值。
难点:
1、优先级数组priority的理解是难点。
+ | - | * | / | ( | ) | # | |
+ | 1 | 1 | 2 | 2 | 2 | 1 | 1 |
- | 1 | 1 | 2 | 2 | 2 | 1 | 1 |
* | 1 | 1 | 1 | 1 | 2 | 1 | 1 |
/ | 1 | 1 | 1 | 1 | 2 | 1 | 1 |
( | 2 | 2 | 2 | 2 | 2 | 3 | 0 |
) | 1 | 1 | 1 | 1 | 0 | 1 | 1 | <