`
lingangw
  • 浏览: 10810 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

逆波兰表达式 及其实现

阅读更多

转自:http://sxpyrgz.iteye.com/blog/721941

 

逆波兰表达式
逆波兰表达式又叫做后缀表达式。在通常的表达式中,运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家 J.Lukasiewicz于1929年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式      逆波兰表达式
 
a+b   --->  a,b,+   
a+(b-c) --->  a,b,c,-,+   
a+(b-c)*d   --->  a,b,c,-,d,*,+   
a+d*(b-c)     --->  a,d,b,c,-,*,+

逆波兰表达式的用途
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下: 按顺序扫描逆波兰表达式,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元
素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。

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

上面的算法比较抽象,下面来个实际例子

写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。
如:传递表达式"5 + ((1 + 2) * 4) − 3"返回计算的结果。
1.将中缀表达式转换为逆波兰表达式
1)建立一个运算符栈stackOperator用来存放运算符;建立一个字符串链表reversePolishExpression用来存放逆波兰表达式
2)顺序扫描
"5 + ((1 + 2) * 4) − 3",根据算法可以得出stackOperatorreversePolishExpression值的变化过程:

扫描     操作   
stackOperator值    reversePolishExpression值           注释

5           输出               空                                 5                           
当前字符是数字直接输出该数字
+          
入栈               +                                  5                             栈顶元素为空,不用比较,入栈
(           入栈                (                                   5                             当前运算符为'(',直接入栈
(           入栈                (  (                                5                             当前运算符为'(',直接入栈
1         
输出                (  (                                5 1                         
当前字符是数字直接输出该数字
+          入栈                (  ( +                             5  1                         + 优先级< 栈顶元素 ( ,入栈
2         
输出
                (  ( +                             5  1  2                     当前字符是数字直接输出该数字
)           出栈                (                                   5   1  2  +                出栈并顺序输出运算符直到遇到第一个'('
*           入栈                (  *                                5   1  2  +                 * 优先级< 栈顶元素 ( ,入栈
4         
输出
                (  *                                5   1  2  +  4             当前运算符为'(',直接入栈
)          
输出               
                                 5   1  2  +  4  *          出栈并顺序输出运算符直到遇到第一个'('
-            入栈               
-
                                   5   1  2  +  4  *          栈顶元素为空,不用比较,入栈
3         
输出                 -
                                   5   1  2  +  4  *  3      当前字符是数字直接输出该数字
最后     输出                空                                  5   1  2  +  4  *  3  -   顺序出栈并输出运算符直到栈元素为空

下表给出了该逆波兰表达式从左至右求值的过程,堆栈栏给出了中间值,用于跟踪算法。

输入 操作 堆栈 注释
5 入栈 5
1 入栈 5, 1
2 入栈 5, 1, 2
+ 加法运算 5, 3 (1, 2)出栈;将结果(3)入栈
4 入栈 5, 3, 4
* 乘法运算 5, 12 (3, 4)出栈;将结果(12)入栈
+ 加法运算 17 (5, 12)出栈;将结果 (17)入栈
3 入栈 17, 3
减法运算 14 (17, 3)出栈;将结果(14)入栈

计算完成时,栈内只有一个操作数,这就是表达式的结果:14

分享到:
评论

相关推荐

    逆波兰表达式及其算法实现

    ### 逆波兰表达式及其算法实现 #### 一、引言 逆波兰表达式(Reverse Polish Notation, RPN)是一种特殊的数学表达式表示方法,它最初由波兰逻辑学家Jan Łukasiewicz提出。与传统的中缀表达式相比,逆波兰表达式...

    基于逆波兰表达式的科学计算机源码

    本项目提供了一个基于逆波兰表达式的科学计算器的源码,非常适合学习者深入理解计算原理和编程实现。 首先,我们要了解逆波兰表达式的工作原理。在普通中缀表达式(如2 + 3 * 4)中,运算符位于操作数之间,而在逆...

    逆波兰算术表达式解析的JavaScript实现

    首先,我们需要一个函数来将普通的中缀表达式转换为逆波兰表达式。这个过程通常称为中缀转后缀或中缀表达式到逆波兰表达式的转换。这个转换涉及到运算符的优先级和结合性规则。例如,乘法和除法的优先级高于加法和...

    什么是逆波兰表达式?详细讲解!

    逆波兰表达式,又称后缀表达式,是波兰逻辑学家扬·鲁道夫·卢卡西维茨在1929年提出的一种数学表达式表示方法。与我们常见的中缀表达式(运算符位于...在数据结构的学习中,掌握逆波兰表达式及其求值算法是十分必要的。

    逆波兰表达式

    逆波兰表达式,又称后缀表达式,是一种数学表达式的表示方法,它...同时,"myPolishNotation"可能是这个工具的源码文件或相关资源,你可以解压并研究其中的实现细节,这对于理解逆波兰表达式及其求值算法会有很大帮助。

    逆波兰表达式课设 张王杨.zip

    逆波兰表达式,又称后缀表达式,是计算机科学中的一种数学...通过这个课设,你不仅能深入理解逆波兰表达式及其计算方法,还能提升你的算法设计和编程能力。在实践中不断调试和完善,你将能够熟练掌握这一重要计算工具。

    算法-逆波兰表达式(信息学奥赛一本通-T1198)(包含源程序).rar

    逆波兰表达式,又称后缀表达式,是计算机科学中的一种数学表达式表示方式,它在计算和编译原理领域有着...通过掌握逆波兰表达式及其计算方法,不仅可以提高信息学竞赛的解题能力,也能为后续的编程学习打下坚实基础。

    Python实现处理逆波兰表达式示例

    逆波兰表达式(Reverse Polish Notation,RPN),也称为后缀表达式,是由波兰逻辑学家J.Lukasiewicz在1929年...学习和掌握逆波兰表达式及其计算方法,对于深入理解和应用数据结构以及编程语言的内部机制具有重要意义。

    用C写的一个算24点代码,使用逆波兰表达式的求值.zip

    总结来说,这个代码实现的核心是理解和应用逆波兰表达式及其计算,结合C语言的数据结构和控制流来处理24点游戏的逻辑。通过这样的实现,我们可以从四张牌的所有可能组合中找出能够得到24的运算序列。这对于理解和...

    后缀表达式(逆波兰表达式或逆波兰记法).pdf

    ### 后缀表达式(逆波兰表达式或逆波兰记法) #### 定义与特点 后缀表达式,又称为逆波兰表达式或逆波兰记法,是一种数学表达式的特殊表示方法。与传统的中缀表达式不同,在后缀表达式中,操作符位于其操作数之后...

    delphi 自定义公式计算

    本文将深入探讨如何在Delphi中实现自定义公式计算,主要涉及逆波兰表达式(也称为后缀表达式)及其在计算公式值中的应用。 首先,我们要理解什么是逆波兰表达式。逆波兰表达式是一种数学表达式的表示方式,它将操作...

    Java写的泥波兰式.rar_reverse polish_逆波兰_逆波兰式

    通过学习和理解逆波兰表达式及其Java实现,开发者可以提升对数据结构和算法的理解,特别是在设计和优化计算逻辑时。同时,逆波兰表达式也常用于编译器设计、计算器程序等领域,具有广泛的应用价值。

    逆波兰式的生成(包括输入表达式是否合法的判定)

    ### 逆波兰式的生成及其合法性判断 #### 一、引言 逆波兰式(Reverse Polish Notation, RPN)是一种后缀表示法,通常用于计算数学表达式,它避免了传统数学表达式中的括号使用问题,使得计算更加高效且简单。在本篇...

    逆波兰表示法实现四则运算

    评估逆波兰表达式则相对简单,同样使用栈,从左到右扫描后缀表达式,遇到数字就压入栈,遇到操作符则取出栈顶两个数进行运算,结果再压回栈。当表达式扫描完毕,栈中只剩一个元素,这个元素就是最终的结果。 在这个...

    编译原理实验报告6-逆波兰式的翻译和计算.doc

    逆波兰式,又称后缀表达式,是一种在计算表达式时可以避免使用括号的表示方式。它将运算符放在操作数之后,使得表达式的计算可以通过栈的数据...通过这个实验,新手可以更好地掌握逆波兰式及其在编译器设计中的作用。

    ruc-波兰表达式c语言递归demo笔记

    波兰表达式的解析通常通过两个主要步骤完成:首先,将输入的字符串转换为逆波兰表达式;然后,使用栈数据结构对逆波兰表达式进行求值。 在C语言中,递归是一种强大的编程工具。当一个函数在其定义中调用自身时,就...

    算术表达式解析模板代码 逆波兰

    递归算法在解析逆波兰表达式中起着核心作用。通常,解析过程包括以下步骤: 1. 初始化一个空栈。 2. 从左到右扫描后缀表达式。 3. 遇到操作数时,直接压入栈中。 4. 遇到运算符时,弹出栈顶的两个操作数,与当前...

    逆波兰式计算

    通过理解逆波兰表达式及其计算方法,开发者可以更好地理解和实现计算逻辑,尤其是对于需要高效计算和避免复杂表达式解析的场景。 在提供的代码文件中,我们可以期待找到一个实现逆波兰式计算的源代码示例,这可能是...

    利用逆波兰式求表达式值

    1. 逆波兰式表示法及其解析原理,使用栈数据结构实现逆波兰式求值。 2. MFC框架下的C++编程,创建逆波兰式求值器类。 3. 在MFC环境中使用图形组件(如CChart或GDI+)绘制曲线图。 4. 数学函数的可视化,通过逆波兰式...

Global site tag (gtag.js) - Google Analytics