当前位置: 首页 > 知识库问答 >
问题:

使用反向波兰符号(RPN)的算术表达式求值

公冶和豫
2023-03-14

数学表达式通常用内插符号表示。出于评估目的,我们可以将其更改为后缀(反向抛光)表示法(使用像分流场这样的算法),然后使用堆栈评估后缀表示法。

我发现计算器使用这种技术,但今天的现代编译器是否使用这种技术来计算算术表达式?它是否足够有效或正在使用其他技术(或算法)?

共有1个答案

谢泽语
2023-03-14

为了回答这个问题,让我们关注您提到的概念,中缀符号调车场评估,然后将它们与编译关联起来。

首先,我们需要了解计算机如何处理表达式。表达式被转换为抽象语法树(AST),然后用于创建代码。将树转换为代码的过程各不相同,但AST的遍历与计算表达式的过程相同。

AST用于12:

   + 
  / \ 
 1   2

后缀:1 2

这是通过访问左分支,1
访问右分支,2
,然后将运算符应用到两个操作数来计算的。

1*2 3^4的AST:

     + 
   /   \
  ^     *
 / \   / \
3   4 1   2

后缀:3 4^1 2*

通过访问左分支3^4
然后访问它的左分支3
然后访问它的右分支4
然后访问操作符,^,然后评估3^4,并将其作为``的新左分支,即81

然后访问右分支1*2
然后访问它的左分支1
然后访问它的右分支2
然后访问运算符,*,并计算1*2并保持为''的新右分支,即。2个

然后访问运算符,计算81 2并返回结果83

现在内缀符号是句法糖,使使用表达式更容易为人类阅读。为了帮助将内插符号转换为AST,转换算法需要知道运算符的优先级和关联性。该算法还使用了一个堆栈,这是调车场算法的主要关键之一。我所知道的将内缀转换为评估策略的每一种方法都以某种方式使用堆栈。

虽然编译器不会像计算器应用程序那样显式地对表达式求值,但编译器会将求值树的遍历转换为执行求值的代码。

注意:由于我不知道每种语言的每一个编译器,我只能根据一般概念给你一个答案。没有规则要求遵循这些规则,如果一些编译器跳过AST,从输入代码转到编译代码而不使用AST,我也不会感到惊讶。

另外,因为您提到了编译器,所以我只讨论了编译后的代码,没有涉及脚本语言。

现在回到你的问题上:

今天的现代编译器是否将其用于算术表达式求值?

我不会特别使用调车场算法,而是使用堆栈的概念,这是我将使用的算法的关键概念之一。如果使用算法的概念与使用算法相同,您可以自己选择。

是否足够高效或正在使用其他技术(或算法)?

希望你现在知道这个问题的答案。重要的不是调车场算法,而是使用堆栈转换中缀符号的概念,这是编译器使用的概念。请记住,编译语言通常不只是计算表达式,它们处理类型、处理条件表达式、存储值,并创建更高的类型,如方法/函数、类和模块。

 类似资料:
  • 给定一棵仅由加减法运算符、数字组成的二进制算术表达式树,如何使树尽可能平衡?任务是在不求表达式值的情况下平衡树,即节点数应该保持不变。 示例: 加法是可交换的和相联的,这允许平衡。交换性允许交换连续“+”节点的子节点。关联性允许旋转。在上述示例中,所执行的转换可以被视为 null 另一种方法可以是将表达式树读入数组,并用变量替换任何'-'子树。然后使用DP确定括号的最佳位置。这必须是自下而上的,这

  • 表达式与运算符 表达式 表达式为 JavaScript 的短语可执行并生成值。 1.7 // 字面量 "1.7" var a = 1; var b = '2'; var c = (1.7 + a) * '3' - b 运算符 算数运算符 (+ - * / %) 关系运算符 (> < == != >= <= === !==) 逻辑运算符 (! && ||) 位运算符 (& | ^ ~ <

  • 问题内容: 我正在尝试编写一个正则表达式来检查给定的字符串是否像a + b,2 + a + b,3 + 6 * 9 + 6 * 5 + a * b等… 仅+和*运算符。 我试过了 不幸的是,它仅处理3 * 7 …(数字*数字)之类的情况。 等待您的答案,感谢您的阅读。 问题答案: 把和字符类中。 演示

  • 首先,我知道有很多这样的话题,但是我在stackoverflow中寻找解决方案,但是我没有找到解决方案。我的问题是Spring MVC中的字符集编码。就我而言,我指的是像ę,ó,ż这样的波兰字母。 我尝试了一切,从CharacterEncodingFilter开始,在maven-pom中设置UTF-8编码。xml,在ThymelafViewResolver和TemplateResolver中设置U

  • 我在骆驼路线中使用了这个表达: 然而,它对这个符号感到震惊。 如何构造这个表达式,假定它从消息体上POJO的getter获取一个值,并将其压缩到Exchange上的一个属性(加1)。

  • 了解ANTLR最好的方法就是实例。构建一个简单的计算器是个不错的主意。为了使它容易理解且保持简单,我们将只允许基本的算术运算符(加、减、乘、除)、括号表达式、整数和变量。 grammar Calc; prog : stat+ ; stat : expr | ID '=' expr ; expr : expr ('*'|'/') expr