1、扫描中缀表达式 (假设是合法的中缀表达式)
设 两个栈 s1 和 s2 , s1 用作存放转换时的中间结
果 , s2 用于存放表达式中的括号和 运算符
a) 扫描到数字字符串A , 则数字字符串入栈s1
b) 接着扫描 符号 B
i. 如果是 + 或 - 或 ( , 这符号入栈 s2
ii. 如果是 * 或 /
1. 继续扫描后面相邻的串 C
a) 如果是数字 , 则从s1中弹出 数字字符串 A,拼接成字符串 ACB,并将字符串 ACB放入栈 s1 中
b) 如果是 ( , 则将 ( 放入到 栈s1 中
c) 转到 a) 执行
iii. 如果是 ( , 则 弹出 s2 中 的一个符号 G ,如果G是 ( 符号 ,则转到 a)执行 ,否则,从张s1中的两个 串 E 和 F ,拼接成字符串 EFG ,并将EFG入栈
iv. 转到 iii. 执行
以实例来讲解转换的方法
以 9*30+2*(5 - 4/2)-(6*2+1)这个中缀表达式为例子
开始从左到右扫描中缀表达式
9*30+2*(5 - 4/2)-(6*2+1)
1、首先扫描到 A=9 ,放入栈s1中
2、继续扫描到 B=*
3、因为 B = * , 所以继续扫描后面相邻的串 , 扫描得到 C = 30,
所以从s1中弹出 串 9 , 拼接成字符串 9 30 * , 将 9 30 * 放入栈 s1 中
4、继续扫描 , 扫描到 + , 将 + 放入到 栈 s2 中
5、继续扫描 , 扫描到 2 , 将 2 放入到 栈 s1 中
6、继续扫描 , 扫描到 * , 扫描后续串 , 得到后续串 为 ( ,则将 * 放入栈s2中 ,将 ( 放入栈s2中
7、继续扫描 , 扫描到 5 , 放入到栈s1中
8、继续扫描 , 扫描到 - ,将 - 放入到栈s2中
9、继续扫描 , 扫描到 4 ,将4放入到栈 s1 中
10、继续扫描 , 扫描到 / ,则继续扫描后续串 , 发现为数字串 2
则 从s1 中弹出栈顶的串 , 此处为 4 ,并拼接成新串 4 2 / , 并将新串 4 2 / 放入到栈 s1 中
11、继续扫描 , 扫描到 ) , 则此时从 栈 s1 中弹出两个 串 ,从 s2 中弹出一个串 ,然后组合成一个新串 5 4 2 / , 并将串 5 4 2 /- 放入栈s1 , 然后继续弹出s2 中的一个串 ,发现不是 ( ,则继续 弹出 s1中的两串 组合成新串 2 5 4 2 / -* 并放入栈 s1中 , 然后继续弹出s2 中德一个串 , 发现是 ( , 这舍弃( 并继续扫描中缀表达式
12、继续扫描 , 扫描到 - ,放入栈s2中
13、继续扫描 , 扫描到 ( ,放入栈 s2 中
14、继续扫描 , 扫描到 6 ,放入栈 s1 中
15、继续扫描 , 扫描到 * , 这接着扫描他的后面的相邻串 扫描到 2 , 为数字串
则从s1 中弹出 栈顶的串 组成新的串 为 6 2 * ,并放入栈中
16、继续扫描 , 扫描到 + ,放入栈 s2 中
17、继续扫描 , 扫描到 1 ,放入栈 s1 中
18、继续扫描 , 扫描到 ) , 这从 s1 中弹出 两 串 , 从s2 中弹出一个串 , 组合成新串 6 2 * 1 + 并放入栈 s1 中
19、继续扫描 , 发现中缀表达式已经扫描完了 ,
20、则 从 s1 中弹出 两 串 , 从s2 中弹出一个串 , 组合成新串 ,
2 5 4 2 /- * 6 2 * 1 + - 并放入 栈 s1 中,继续从 s1 中弹出 两 串 , 从s2 中弹出一个串 , 组合成新串 , 9 30 * 2 5 4 2 / -* 6 2 * 1 + - + ,此时两栈以经为空 , 这所得到的后缀表达式就是 9 30 * 2 5 4 2 / * 6 2 * 1 + - -
21、 9 30 * 2 5 4 2 / - * 6 2 * 1 + - + , 通过计算可发现 该后缀表达式 是正确的
继续扫描到 B=* , 存到 栈 s2 中 ,并暂存到
继续扫描到 30 ,
---恢复内容结束---