问题标签 [shunting-yard]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2667 浏览

c# - 调车场验证表达式

我们使用 Shutting-Yard 算法来评估表达式。我们可以通过简单地应用算法来验证表达式。如果缺少操作数、不匹配的括号和其他东西,它会失败。然而,Shunting-Yard 算法具有比人类可读的中缀更大的支持语法。例如,

是所有可接受的方式来提供“1+2”作为Shunting-Yard 算法的输入。'+ 1 2' 和 '1 2 +' 不是有效的中缀,但标准的 Shutting-Yard 算法可以处理它们。该算法并不真正关心顺序,它按优先顺序应用运算符,获取“最近”操作数。

我们希望将输入限制为有效的人类可读的中缀。我正在寻找一种方法来修改 Shunting-Yard 算法以使中缀无效或在使用 Shunting-Yard 之前提供中缀验证。

有谁知道任何已发表的技术可以做到这一点?我们必须同时支持基本运算符、自定义运算符、括号和函数(带有多个参数)。除了在线基本操作员之外,我还没有看到任何可以使用的东西。

谢谢

0 投票
0 回答
40 浏览

java - 后缀转换器输出问题的中缀

我正在尝试实现后缀转换器的中缀,但我在输出时遇到了一些麻烦,即括号。当我尝试用括号传递任何内容时,请说:

我得到一个 NoSuchElementException。有谁知道怎么了?

一些注意事项:我将一个标记化字符串的双端队列作为中缀传递(因此我仅限于双端队列方法)并返回后缀的字符串双端队列。任何帮助表示赞赏。

这是我有问题的方法:

0 投票
1 回答
335 浏览

java - 后缀数字或字母连接的中缀

正在研究将中缀表示法转换为后缀的程序。我让它适用于大多数情况,除非需要字符连接。例如,如果我传入一串数字 (1002+304),它会输出 1、0、0、2、3、0、4、+ 而不是 1002、304、+。

0 投票
1 回答
744 浏览

python - 调车码算法中的复杂表达式导致计算器错误

我已经实现了调车场算法,如下所示:

它适用于诸如“3 + 4”之类的简单表达式,但如果我输入任何复杂的东西,就会发生这种情况:

$ ./rpn.py

-> 4 - 5 * 6 + 3 ^ 2

(错误)太多的值

在此先感谢,感谢您的帮助!

0 投票
1 回答
956 浏览

java - 如何在有条件的反向波兰符号公式中使用 AND/OR?

假设我有一个“(a > b) OR (c < d)”形式的条件。如何将其转换为反向波兰符号并计算它?我通过将“和/或”标记设置为最低优先级来尝试并得到“abc OR > d <”。这样对吗?

基本上我想在这个调车场算法的实现中添加条件特性;http://eddmann.com/posts/shunting-yard-implementation-in-java/

0 投票
1 回答
99 浏览

shunting-yard - InfixToPostfix 将字符转换为字符串

如何将此代码中的字符转换为字符串?InfixToPostfix 必须能够接受字符串而不是字符,因此它可以接受两位数和空格。有什么建议么?提前致谢。

}

0 投票
1 回答
732 浏览

java - 调车场算法解析函数agruments

我试图让我的调车场算法的实现工作。它适用于数字和运算符。但是当我尝试向输入添加功能时会出现问题。因为函数参数在函数应该输出到右边时输出到函数的左边。

测试程序

算法

示例 1:

输入:cbrt ( 8 )

输出:8 cbrt

输出应该是:cbrt 8

示例 2:

输入:cbrt ( 8 ) + sqrt ( 9 )

输出:8 9 sqrt + cbrt

输出应该是:cbrt 8 sqrt 9 +

示例 3:

输入:5 + 4 - 9 / 2 ^ 6 * cbrt ( 8 )

输出:5 4 + 9 2 6 ^ / 8 cbrt * -

输出应该是:5 4 + 9 2 6 ^ / cbrt 8 * -

0 投票
3 回答
871 浏览

java - 调车场功能

我在 Java 程序中使用 Shunting-Yard 算法 ( https://en.wikipedia.org/wiki/Shunting-yard_algorithm ) 来创建计算器。我差不多完成了,但我仍然需要实现功能。我遇到了一个问题:我希望计算器在放在一起时自动将 x 和 y 等变量相乘 - 示例:计算器将 xy 转换为 x*y。另外,我希望计算器将 (x)(y) 转换为 (x)*(y) 并将 x(y) 转换为 x*(y)。我已经使用以下代码完成了所有这些工作:

(在我的计算器中,变量名总是单个字符。)
现在这很好用,但是当我实现函数时,这当然行不通。它将“sin(1)”变成“s*i*n*(1)”。我怎样才能让这段代码只为运算符而不是函数进行乘法转换?

0 投票
1 回答
342 浏览

java - 用逻辑实现调车场

所以我正在尝试实现一个调车场来与 Logic 一起工作,我认为这会很容易,直到我遇到为物质条件(->)和双条件(​​<->)设置优先级的问题语句,因为它们需要表示为字符串而不是字符。我需要能够读取带有诸如(A|B) -> !C(这意味着:(A OR B)暗示NOT C)之类的语句的文件并将其转换为后缀表示法。我在第 115 行不断收到 NullPointerException,实际上我不确定为什么,我只能使用 char 值设置案例吗?或者我是否需要找到另一种设置符号优先级的方法。这是我的代码

}

0 投票
0 回答
1161 浏览

binary-tree - 一元运算符、二叉表达式树和调车场算法

我正在编写数学表达式求解器,它采用中缀表达式并求解它们,二叉表达式树和分流场都对我有好处(我什至解决了处理一元和三元运算符的问题)。遇到三角函数问题。当我写 45sin 或 (45)sin 或 (44+1)sin 时,调车场将其转换为有效的逆波兰表示法 (RPN) 并且评估成功。虽然有效的中缀表达式是 sin(44+1) 或 sin45 + 1。请建议解决这个问题。

这是 ExpressionEval 类中的 java 代码,它将中缀转换为 RPN。

一旦我们有了 post-fix 表达式,就会在 ExpressionEval 类的这个函数中完成评估

运算符类与此有些相似。