zoukankan      html  css  js  c++  java
  • 前缀、中缀、后缀互相转换

    中缀 ( ightarrow) 前缀

    以中缀式子 (5+10*(2+6)-8) 作为例子导向。

    首先构造一个运算符栈,然后从右至左扫描中缀表达式。

    • 如果是操作数,则直接输出;

    • 如果是运算符,则比较优先级:

      • 若该运算符优先级大于等于栈顶元素,则将该运算符入栈;
      • 否则栈顶元素出栈并输出,直到该运算符大于等于栈顶元素的优先级时,再将该运算符压入栈中;
      • 遇到右括号直接压入栈中;
      • 如果遇到一个左括号,那么就将栈顶元素弹出并输出,直到右括号,但左右括号并不输出。
    • 若运算符栈中还有元素,则将栈顶元素逐个弹出并输出,最后将输出表达式翻转。

    带入例子:

    (8) 不用压入栈,得:

    (-) 压进去,得:

    ()) 压进去,得:

    同理,将 (2+6) 依次处理,得:

    (() 压进去,依照方法,将 ()) 前的所有数值、运算符弹数来,得:

    遇见 (*) 了,因为该运算符优先级大于等于栈顶元素,所以将该运算符入栈得:

    到了 (+) ,依照方法,将栈顶元素出栈并输出,直到该运算符大于等于栈顶元素的优先级时,再将该运算符压入栈中。所以将 (*) 弹出,压入 (+),得:

    看见 (5),紧接着便输出了。中缀表达式处理完毕。此时将栈里元素依次弹出,得到一个表达式,将其翻转即得到前缀表达式了,如下:

    中缀 ( ightarrow) 后缀

    规则和中缀到前缀类似,但是是从左往右扫描,并且结果不需要翻转。

    1. 如果是操作数,则直接输出;
    2. 如果是运算符,则比较优先级:若该运算符优先级大于栈顶元素(或栈为空),则将该运算符入栈,否则栈顶元素出栈并输出,直到该运算符大于栈顶元素(或栈为空)的优先级时,再将该运算符压入栈中。
    3. 遇到左括号直接压入栈中,如果遇到一个右括号,那么就将栈顶元素弹出并输出,直到左括号,但左右括号并不输出。
    4. 最后,若运算符栈中还有元素,则将栈顶元素逐个弹出并输出。

    (1) 个例子:(2*(9+6/3-5)+4 ightarrow2 9 6 3/+5-* 4+)

    前缀&后缀 ( ightarrow) 中缀

    前缀和后缀转中缀方法类似。

    前缀 ( ightarrow) 中缀

    从右往左扫描(数字在右侧),遇到数字压入栈,遇到运算符则依次弹出栈顶两个元素进行运算,运算结果压入栈中,如此循环,直到表达式结束。

    后缀 ( ightarrow) 中缀

    从左往右扫描(数字在左侧),其余规则相同。

    后记

    参考了 这篇文章

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/Sam2007/p/13412231.html
Copyright © 2011-2022 走看看