Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为字符串编写求值器,如;(1&x2B;3*(5/4))并得到一个数值结果_C++_C - Fatal编程技术网

C++ 如何为字符串编写求值器,如;(1&x2B;3*(5/4))并得到一个数值结果

C++ 如何为字符串编写求值器,如;(1&x2B;3*(5/4))并得到一个数值结果,c++,c,C++,C,这是一个面试问题 我对它的解决方案感到困惑,我想我需要堆栈来推送和弹出这些运算符和操作数, 但我是否需要两个堆栈,一个用于运算符,一个用于操作数?或者一个堆栈就可以了?我想我们需要两个堆栈,但是有没有办法用一个堆栈来解决这个问题 我也有点困惑这是如何工作的,每次我得到一个操作符,我会弹出我最上面的两个操作数,并将结果推到操作数堆栈中 首选方法是先用括号括起来,然后用除法、多倍运算,最后用减法和加法 但是如何检查何时弹出两个操作数并执行必要的算术运算呢?很好。这是解析。这是一项相当艰巨的工作。。我

这是一个面试问题 我对它的解决方案感到困惑,我想我需要堆栈来推送和弹出这些运算符和操作数, 但我是否需要两个堆栈,一个用于运算符,一个用于操作数?或者一个堆栈就可以了?我想我们需要两个堆栈,但是有没有办法用一个堆栈来解决这个问题

我也有点困惑这是如何工作的,每次我得到一个操作符,我会弹出我最上面的两个操作数,并将结果推到操作数堆栈中

首选方法是先用括号括起来,然后用除法、多倍运算,最后用减法和加法


但是如何检查何时弹出两个操作数并执行必要的算术运算呢?

很好。这是解析。这是一项相当艰巨的工作。。我的一个朋友写了一个非常令人印象深刻的程序,正是为了这个,它也可以在OOP中打开一个变量方程。非常整洁

基本上,列出操作符顺序,从括号开始

查找最内部的:搜索第一个[close],然后从那里返回第一个([open])

现在你有了没有括号的内部短语。现在搜索*例如,找到后面的数字和后面的数字,现在用它替换这个短语(例如514*354.25)

这是最原始的方法。只是给了你一个开始。对于重置,你可能没有选择使用你的大脑:p


(如果您对我朋友的项目感兴趣,请直说)

您正在使用递归定义的结构解析表达式。一个简单的选项是编写所谓的递归解析器:

一旦您了解顶级“parse expression”例程必须调用自身来解析其组成表达式(如expression+expression),那么这就很简单了。您将得到一个操作符节点树,其中包含操作数的表达式树

您也可以使用类似Bison的工具。Bison是一种“编译器”,它为给定语法的语言构建表驱动的解析器。(Bison是一种非常古老的语言:搜索“解析器生成器”以获取更多信息。)

请查看

调车场算法是一种 解析数学模型的方法 中缀符号中指定的方程式。 它可以用于在生产过程中产生输出 反向波兰符号(RPN)或作为 抽象语法树(AST) 算法是由Edsger发明的 并命名为“调车场” 因为它的运算 类似于铁路调车 院子里


我使用boost spirit解析器在很少几行代码中实现了这一点。它在各种上下文中都非常适合我。()


详细说明:spirit解析器允许您在标准BNC中构造语法,并从表达式创建AST树-然后您可以轻松地遍历此树(在解释性环境中)并计算表达式。spirit和BNC需要一个简短的学习曲线,但这肯定比使用自己的表达式计算器容易。这个问题称为递归下降解析器。可能还有其他形式的规范解决方案,我相信可能有——可能有几十种正确的方法。David Eck有一个递归下降解析器在线发布源代码和解释。谷歌应该提供数千个有用的资源,这些资源也应该在dmoz和你最喜欢的搜索引擎上查找。

如果是一个求职面试问题,正如最初的海报所说,那么不太可能期望应聘者拿出一个现成的答案诸如调车场算法、递归下降解析器、将中缀转换为后缀等,可能在最多半个小时内完成

不。他们可能正在测试您处理字符串之类的东西的能力,测试它们的运算符{*,/,+,-},左括号和右括号,数字等,看看您是否可以编写代码/伪代码来评估他们提供的示例表达式,而不是一个完全唱歌、跳舞的应用程序


P>另一方面,如果你想要一个例子来写一个像“(1+3×(5/4)”)这样的字符串的求值器,它返回一个数值结果,这里有一些。

我懒得回答你的问题,但是看看B. Stroustrup的“C++编程语言”可能值得一看。。他的示例程序是一个桌面计算器。像你问题中的表达式通常最好用树来建模,而不是用堆栈。祝你好运!这是一个常见的问题。下面是一个:@谢谢大家的输入,我会搜索这些帮助,以及如何用树来建模原始的和最权威的所以编译器的问题(这是一个编译器的问题):.在各种限制条件下,用非常简短的解决方案对高尔夫问题进行编码:-1因为这对提问的人没有任何帮助。在这方面添加了更明确的增强功能解释;希望这将对提问的人有更多帮助。我不是反对者,我觉得你的解决方案是可以的。但是我这是最幼稚的解决方案,对于这类问题,标准库(见我的答案)和标准算法(Matt+Robert)确实存在。是的,我知道,但如果这家伙问这个问题,他最好从基础开始,不是吗?我写的这是最幼稚的。(顺便说一句,我的朋友不是这样做的)。附议。实际上,一个花哨的解决方案在一个小时以内的面试中可能不起作用。