逆波兰中 中缀表达式转后缀表达式的方法

1、扫描中缀表达式  (假设是合法的中缀表达式)

                              设 两个栈  s1  和 s2  ,  s1 用作存放转换时的中间结

                                    果  , s2 用于存放表达式中的括号和 运算符

a) 扫描到数字字符串, 则数字字符串入栈s1 

b) 接着扫描 符号 B

i. 如果是 或 或 (  , 这符号入栈 s2

ii. 如果是 *  或 

1. 继续扫描后面相邻的串 C

a)  如果是数字 , 则从s1中弹出 数字字符串 A,拼接成字符串  ACB,并将字符串 ACB放入栈 s1 

b) 如果是   (  , 则将  (   放入到  栈s1 

c) 转到   a)  执行

iii. 如果是 (  , 则  弹出 s2 中 的一个符号  ,如果G是 ( 符号 ,则转到 a)执行 ,否则,从张s1中的两个 串  和 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   , 将 放入到 栈 s1 

6、继续扫描 , 扫描到  *   , 扫描后续串  , 得到后续串 为 (  ,则将 *  放入栈s2中 ,将 ( 放入栈s2中 

7、继续扫描 , 扫描到 5    , 放入到栈s1

8、继续扫描 , 扫描到 -    ,将 -  放入到栈s2

9、继续扫描 , 扫描到 4    ,将4放入到栈 s1 

10、继续扫描 , 扫描到 /    ,则继续扫描后续串 , 发现为数字串 

则  从s1 中弹出栈顶的串  , 此处为  ,并拼接成新串   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、继续扫描 , 扫描到 ,放入栈 s1 

15、继续扫描 , 扫描到 , 这接着扫描他的后面的相邻串  扫描到 , 为数字串

则从s1 中弹出 栈顶的串  组成新的串  为  6 2 * ,并放入栈中

16、继续扫描 , 扫描到 ,放入栈 s2 

17、继续扫描 , 扫描到 ,放入栈 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  ,  

 

 

---恢复内容结束---

原文地址:https://www.cnblogs.com/wowk/p/2954524.html