zoukankan      html  css  js  c++  java
  • 逆波兰中 中缀表达式转后缀表达式的方法

    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  ,  

     

     

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

  • 相关阅读:
    有趣的项目链接分享
    Nano Pi安装Opencv-python
    Opencv
    安装库的步骤
    EC20 AT指令
    最详细树莓派/NanoPi网线和电脑直接连接方法
    在Altium Designer中如何将一组器件合并为一个?
    Altium Designer如何快速查找PCB板上元件
    pip升级之后,不能使用
    利用opencv-python(cv2)查看设备连接摄像头的数量
  • 原文地址:https://www.cnblogs.com/wowk/p/2954524.html
Copyright © 2011-2022 走看看