逆波兰式(后缀式)详解 - Go语言中文社区

逆波兰式(后缀式)详解


原表达式:a*(b*(c+d/e)-f)#    /* # 为表达式结束符号*/
后缀式:abcde/+*f-*#

为运算符定义优先级:#   (   +   -   *   /   **

                  -1   0   1   1   2   2   3

从原表达式求后缀式的规则为:

1.设定运算符栈

2.假设表达式的结束符为"#",我们需要预设运算符栈底元素为"#"

3.扫描表达式,若当前字符是操作数,则直接发送给后缀表达式;

4.若当前字符为运算符且优先级大于等于栈顶运算符,则进栈,否则退出栈顶运算符并将其发送给后缀式。然后将当前运算符放入栈中。

5.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式。

6.若当前字符为"(",进栈。

7.若当前字符为")",则从栈顶起,依次将栈中运算符出栈发送给ie后缀式,直到碰到"("。将栈中"("出栈,不需要发送给后缀式。然后继续扫描表达式。

 

====

1、建立运算符栈stackOperator用于运算符的存储,压入''。
2、预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号) 。
3、顺序扫描表达式,如果当前字符是数字(优先级为0的符号),则直接输出该数字;如果当前字符为运算符或括号(优先级不为0的符号),则判断第4点 。
4、若当前运算符为'(',直接入栈;
若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出;
若为四则运算符,比较栈顶元素与当前元素的优先级:
如果 栈顶元素运算符优先级 >= 当前元素的优先级,出栈并顺序输出运算符直到 栈顶元素优先级 < 当前元素优先级,然后当前元素入栈;
如果 栈顶元素 < 当前元素,直接入栈。
5、重复第3点直到表达式扫描完毕。
6、顺序出栈并输出运算符直到栈顶元素为''

====


举例  下面以(a+b)*c为例子进行说明:

  (a+b)*c的逆波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下:

  1)a入栈(0位置)

  2)b入栈(1位置)

  3)遇到运算符“+”,将a和b出栈,执行a+b的操作,得到结果d=a+b,再将d入栈(0位置)

  4)c入栈(1位置)

  5)遇到运算符“*”,将d和c出栈,执行d*c的操作,得到结果e,再将e入栈(0位置)

  经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。

  逆波兰式除了可以实现上述类型的运算,它还可以派生出许多新的算法,数据结构,这就需要灵活运用了。逆波兰式只是一种序列体现形式。

 

 

结论:1,操作数之间的相对顺序不变,运算符的相对次序不同。

2,中缀表达式是没有意义的,去除了括弧。导致运算结果不一致。

3,前缀式的运算规则是:

连续出现的两个操作数和它们之前且紧靠它们的运算符构成一个最小表达式。可以用前缀式求值。

4,后缀式的运算规则刚好与前缀式相反。 

运算符在式中的顺序恰为表达式的运算顺序,(先做乘法,除法,然后加法)每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。

后缀式转成原表达式。

依次入栈,遇到运算符,将两个操作数出栈运算,结果再次放到栈顶。依次循环。

 从原表达式求的后缀式?

出现了后面的操作数才能确定前面的运算。

注意:左边图上应该是设立运算符栈

每个运算符的运算次序要由它之前的一个运算符来定,在后缀式中,优先级高的运算符领先于优先级低的运算符




版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tianmo2010/article/details/6804784
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 10:13:27
  • 阅读 ( 2090 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢