美文网首页
后缀(逆波兰)表示法

后缀(逆波兰)表示法

作者: KevinTing | 来源:发表于2017-02-27 23:52 被阅读342次

后缀表示法是对栈的典型应用,所谓后缀表示法就是将我们平时所用的四则运算表达式(中缀表示法)以不需要括号,表示成计算机容易理解的形式。这样说很抽象,下面举个例子:

9 + (3 - 1) X 3 + 10 / 2

这就是中缀表示法,也是我们平时书写的四则运算的标准形式,之所以叫中缀,是因为运算符都在两个运算数字的中间。而将运算符放在两个需要计算的数字后面,自然就叫后缀表示法了,比如上面的表达式转换为:

9 3 1 - 3 * + 10 2 / +

1、后缀表达式如何计算?

先不管后缀表达式是怎么来的,先来看为什么前面说后缀表达式适合计算机理解?计算机理解的规则如下:
1、从左到右遍历后缀表达式的每个数字和符号;
2、遇到数字进栈;
3、遇到符号就将栈顶两个数字出栈,并计算,计算的结果进栈;
4、重复2、3直到遍历结束,获得最终结果。
比方说前面的后缀表达式 9 3 1 - 3 * + 10 2 / +,计算过程是这样的:
1、9 3 1都是数字,依次进栈,栈中内容为:9 3 1;
2、遇到“ - ”符号,那么3 1出栈,计算得到2进栈,栈中内容为:9 2;
3、接下来3进栈,栈中内容为:9 2 3;
4、遇到“ * ”符号, 2 3出栈,并计算得到6进栈,栈中内容为:9 6;
5、又遇到“ + ”符号,9 6出栈,计算得到15进栈,栈中内容为:15;
6、接着数字10 2进栈,栈中内容为:15 10 2;
7、遇到符号“ / ”,10 2出栈,计算得到5进栈,栈中内容为:15 5;
8、遇到最后一个符号“ + ”,15 5出栈,计算得到20,遍历结束,结果为20。
从上面的过程来看,计算机只需要一次遍历加上一个栈就可以计算出来表达式的值,后缀表达式确实利于计算机理解,也省掉了烦人的括号!

2、中缀表达式如何转换为后缀表达式?

但是实际上人们书写的时候肯定还是写便于人类理解的中缀表达式,那么计算机在理解中缀表达式的时候,实际上是先将中缀表达式转换为它容易理解的后缀表达式,再依据前面描述的规则进行计算的。中缀表达式转换为后缀表达式的过程也需要用到栈,规则如下:
1、从左到右遍历中缀表达式的每个数字和符号;
2、遇到数字输出,成为后缀表达式的一部分;
3、遇到符号,如果符号是左括号,或者符号的优先级比栈顶元素高,那么该符号进栈;如果符号是右括号,那么栈里必然存在左括号,将栈中符号依次出栈并输出作为表达式一部分,直到左括号出栈(括号不用输出);如果符号的优先级小于或等于栈顶元素,那么栈中符号依次出栈并输出作为表达式一部分,直到符号的优先级大于栈顶元素为止,同时该符号进栈。
4、重复2、3直到遍历结束,如果此时栈不为空,那么依次栈中符号出栈,输出作为表达式最后一部分。
比如说9 + (3 - 1) X 3 + 10 / 2的转换过程如下:
1、9是数字,输出,表达式为:9;
2、“ + ”进栈,“ ( ”进栈,栈内容为:+ (;
3、数字3输出,表达式为:9 3;
4、“ - ”进栈,栈内容为:+ ( -;
5、数字1输出,表达式为:9 3 1;
6、遇到“ ) ”,根据规则,栈中符号出栈直到“ ( ”出栈为止,此间遇到“ - ”需要输出,因此表达式为:9 3 1 -,栈中内容为:+;
7、遇到“ X ”,由于它的优先级比栈顶元素“ + ”高,因此它进栈,栈中内容为:+ X;
8、遇到数字3输出,表达式为:9 3 1 - 3;
9、之后是“ + ”,优先级比栈顶的“ X ”低,“ X ”出栈输出,“ + ”变成栈顶,栈顶的“ + ”优先级并不大于外面的“ + ”,因此也需要出栈输出,此时栈为空了,那么表达式为:9 3 1 - 3 X +,同时外面的“ + ”进栈,栈中内容为:+;
10、遇到10输出,表达式为:9 3 1 - 3 X + 10;
11、遇到符号“ / ”,优先级比栈顶元素“ + ”高,进栈,栈中内容为:+ /;
12、数字2输出,表达式为:9 3 1 - 3 X + 10 2;
13、遍历结束,栈不为空,栈中符号依次出栈输出,最后表达式为:9 3 1 - 3 X + 10 2 / +。

相关文章

  • 汪都能理解的逆波兰计算器(C++实现)

    简介 EXPLANATION 逆波兰表示法(Reverse Polish notation, RPN)也称作后缀表...

  • 后缀(逆波兰)表示法

    后缀表示法是对栈的典型应用,所谓后缀表示法就是将我们平时所用的四则运算表达式(中缀表示法)以不需要括号,表示成计算...

  • 逆波兰表示法 Python

    给定一个逆波兰表示法,计算表达式的值。 逆波兰表示:又名后缀表达式,二元运算符置于两个运算对象之后,例如 2 + ...

  • 力扣(LeetCode) -150 逆波兰表达式求值

    本题考察的是后缀(逆波兰)表达式和栈的使用 题目描述 根据逆波兰表示法,求表达式的值。 有效的运算符包括 +, -...

  • 逆波兰表示

    20世纪50年代,波兰逻辑学家提出了一种不需要括号的后缀表示法,也成为逆波兰(Reverse Polish Not...

  • ARTS第七周20200705

    Algorithm 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / ...

  • LeetCode-150- 逆波兰表达式求值

    逆波兰表达式求值 题目描述:根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是...

  • Day75 逆波兰表达式求值

    根据 逆波兰表示法,求表达式的值。 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰...

  • LeetCode之Reverse Polish Notation

    1. 关于Reverse Polish Notation 摘自 维基百科 的解释: 逆波兰表示法(Reverse ...

  • Leetcode150 Evaluate Reverse Pol

    根据逆波兰表示法,求表达式的值。 有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达...

网友评论

      本文标题:后缀(逆波兰)表示法

      本文链接:https://www.haomeiwen.com/subject/ezptgttx.html