`
nwangwei
  • 浏览: 24067 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

表达式求值的经典算法

阅读更多

转载自:http://www-128.ibm.com/developerworks/cn/java/j-w3eva/index.html

 

表达式求值的经典算法

编写代码对算术表达式求值的经典方法由 Donald Knuth 描述于 1962 年(请参阅 参考资料)。Knuth 将此概括为三个步骤:

  • 对中缀表达式进行语法分析
  • 中缀表达式到后缀表达式的转换
  • 对后缀表达式求值

注意到我们谈到的这个经典算法有些简化:算术表达式只包含操作数、二元操作符和一种括号。此外,对于每个操作数和操作符,只用单个字符表示,使语法分析直观。

表达式表示法

算术表达式中最常见的表示法形式有 中缀、前缀后缀表示法。中缀表示法是书写表达式的常见方式,而前缀和后缀表示法主要用于计算机科学领域。

中缀表示法
中缀表示法是算术表达式的常规表示法。称它为 中缀表示法是因为每个操作符都位于其操作数的中间,这种表示法只适用于操作符恰好对应两个操作数的时候(在操作符是二元操作符如加、减、乘、除以及取模的情况下)。对以中缀表示法书写的表达式进行语法分析时,需要用括号和优先规则排除多义性。

 

Syntax: operand1 operator operand2
Example: (A+B)*C-D/(E+F)

 

前缀表示法
前缀表示法中,操作符写在操作数的前面。这种表示法经常用于计算机科学,特别是编译器设计方面。为纪念其发明家 ― Jan Lukasiewicz(请参阅 参考资料),这种表示法也称 波兰表示法

 

Syntax  : operator operand1 operand2
Example : -*+ABC/D+EF

 

后缀表示法
在后缀表示法中,操作符位于操作数后面。后缀表示法也称 逆波兰表示法(reverse Polish notation,RPN),因其使表达式求值变得轻松,所以被普遍使用。

 

Syntax  : operand1 operand2 operator
Example : AB+C*DEF+/-

 

前缀和后缀表示法有三项公共特征:

  • 操作数的顺序与等价的中缀表达式中操作数的顺序一致
  • 不需要括号
  • 操作符的优先级不相关

中缀表达式到后缀表达式的转换

要把表达式从中缀表达式的形式转换成用后缀表示法表示的等价表达式,必须了解操作符的优先级和结合性。 优先级或者说操作符的强度决定求值顺序;优先级高的操作符比优先级低的操作符先求值。 如果所有操作符优先级一样,那么求值顺序就取决于它们的 结合性。操作符的结合性定义了相同优先级操作符组合的顺序(从右至左或从左至右)。

 

Left associativity  : A+B+C = (A+B)+C
Right associativity : A^B^C = A^(B^C)

 

转换过程包括用下面的算法读入中缀表达式的操作数、操作符和括号:

  1. 初始化一个空堆栈,将结果字符串变量置空。
  2. 从左到右读入中缀表达式,每次一个字符。
  3. 如果字符是操作数,将它添加到结果字符串。
  4. 如果字符是个操作符,弹出(pop)操作符,直至遇见开括号(opening parenthesis)、优先级较低的操作符或者同一优先级的右结合符号。把这个操作符压入(push)堆栈。
  5. 如果字符是个开括号,把它压入堆栈。
  6. 如果字符是个闭括号(closing parenthesis),在遇见开括号前,弹出所有操作符,然后把它们添加到结果字符串。
  7. 如果到达输入字符串的末尾,弹出所有操作符并添加到结果字符串。

后缀表达式求值

对后缀表达式求值比直接对中缀表达式求值简单。在后缀表达式中,不需要括号,而且操作符的优先级也不再起作用了。您可以用如下算法对后缀表达式求值:

  1. 初始化一个空堆栈
  2. 从左到右读入后缀表达式
  3. 如果字符是一个操作数,把它压入堆栈。
  4. 如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。
  5. 到后缀表达式末尾,从堆栈中弹出结果。若后缀表达式格式正确,那么堆栈应该为空。
分享到:
评论

相关推荐

    表达式求值 算法 代码 报告 流程图

    以下是对表达式求值算法、代码实现、报告编写及流程图的详细解释。 1. **表达式求值算法**: - **前缀表达式(波兰表示法)**:运算符位于操作数之前,如 `+ a b` 表示 `a + b`。 - **后缀表达式(逆波兰表示法)...

    使用Java语言实现后缀表达式的求值算法

    后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现...

    基于栈的算术表达式求值算法

    基于栈的算术表达式求值算法是一种常见的计算方法,主要应用于解决逆波兰表示法(Reverse Polish Notation,RPN)或中缀表达式的求值问题。本实验旨在让学生掌握栈这种数据结构的定义和实现,并能利用栈解决实际问题...

    栈实现算术表达式求值和队列实现舞伴配对

    1.通过修改完善课件案例 3.3 的算法,利用栈来实现算术表达式求值的算法。对算法中调 用的几个函数要给出其实现过程: (1) 函数 In(c):判断 c 是否为运算符; (2) 函数 Precede(t1,t2):判断运算符 t1 和 t2 的...

    表达式求值,用二叉树

    使用二叉树来表示和求解表达式,不仅简化了表达式的解析过程,提高了计算效率,还便于理解和实现更复杂的数学表达式求值算法。通过对表达式的合法性检查、构建二叉树、遍历和求值等步骤的详细说明,我们可以深入理解...

    数据结构 表达式求值算法

    严蔚敏数据结构 表达式求值 c语言实现 符号优先级

    表达式求值的算法设计

    ### 表达式求值的算法设计 #### 概述 表达式求值是计算机科学中的一个基础且重要的概念,广泛应用于编译器设计、计算器应用程序等场景。本篇文章将根据给定的部分代码来深入探讨如何设计一种有效的算法用于表达式...

    表达式求值算法-符号优先原则

    在"表达式求值"这个主题中,你可能会遇到的子问题包括如何处理括号以改变运算顺序,如何处理运算符的优先级冲突,以及如何有效地实现这个算法,以确保正确性和效率。对于初学者来说,理解并实现一个简单的表达式求值...

    表达式求值代码

    以下是一个基本的表达式求值算法步骤: 1. 从左到右遍历表达式。 2. 如果遇到操作数,直接压入栈中。 3. 如果遇到运算符,与栈顶运算符比较优先级: - 如果栈为空,或者当前运算符优先级高于/等于栈顶运算符,将...

    表达式求值算法-算符优先法

    "表达式求值算法-算符优先法" 表达式求值算法是计算机科学中的一种基本算法,用于计算数学表达式的值。在这篇文章中,我们将讨论一种特殊的表达式求值算法,即算符优先法。 算符优先法是一种基于栈的算法,利用...

    栈的应用----算术表达式求值程序

    栈的应用广泛,其中之一就是用于解决算术表达式的求值问题。本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+...

    《数据结构_课程设计》表达式求值_实验报告

    《数据结构_课程设计》表达式求值_实验报告详细解析 本次实验是关于数据结构课程设计的一个项目,主要目标是实现一个算术表达式的求值程序,利用栈这一数据结构来处理运算符的优先级,从而计算出表达式的正确结果。...

    表达式求值C++代码(含实验报告)

    总的来说,这个项目提供了C++实现表达式求值的实例,对于学习数据结构、算法、编译原理以及提升编程能力都非常有帮助。通过阅读和理解代码,以及实验报告,学生可以深入理解表达式求值的原理,并锻炼到实际编程技能...

    表达式求值C语言实现

    在IT领域,表达式求值是一项基础且重要的任务,它涉及到计算机如何解析和计算数学或逻辑表达式。本文将深入探讨一个用C语言实现的表达式求值程序,该程序特别强调了对浮点数(float型)和乘方运算的支持。 首先,...

    数据结构课程设计算数表达式求值

    数据结构课程设计算数表达式求值是指编写算法能够进行整型和实型数的表达式求值,能够根据运算的数据选择正确的运算结果的数据类型。该课程设计的目的是为了让学生掌握基本的数据结构和算法设计能力,提高学生的编程...

    基于栈的算术表达式求值算法.rar

    总的来说,基于栈的算术表达式求值算法是一种高效的方法,它利用了数据结构栈的特性来处理运算符的优先级和结合性。这种算法广泛应用于编译器设计、解释器实现以及各种计算工具中。了解和掌握这种算法对于深入理解...

    数据结构表达式求值

    数据结构表达式求值是计算机科学中的一种重要技术,涉及到数据结构和算法的设计与实现。在本节中,我们将讨论数据结构表达式求值的基本概念、实现方法和相关的算法。 数据结构 在数据结构表达式求值中,我们需要...

    后缀表达式求值(c语言版)

    后缀表达式的求值算法 在代码中,`qiu_zhi(char *A)`函数实现了后缀表达式的求值。算法首先初始化一个整数栈`s`,然后遍历输入的字符串`A`(即后缀表达式)。对于每个字符,如果它是一个数字,则将其转换为整数并...

    数据结构-表达式求值实验报告.doc

    数据结构是计算机科学中的一门重要课程,涉及到算法、数据存储、表达式求值等多个方面。在本次实验报告中,我们将着重于表达式求值的实现,包括数据结构设计、算法设计、ADT 描述等方面。 1. 数据结构设计 在...

Global site tag (gtag.js) - Google Analytics