java - 这是调车院的错还是我的错?

标签 java algorithm parsing shunting-yard

给定表达式:

 1/2/3/4*5 

它到达表达式的末尾并尝试首先将 4 和 5 相乘,这是错误的,因为它开始从堆栈中弹出。我不一定在做 RPN,只是在现场评估。我怎样才能防止这种情况发生?

// Expression was completely read - so we should try and make sense of
// this now
while (operatorStack.size() != 0) {
    ApplyOperation(operatorStack, operandStack);
}

此时,我开始弹出运算符和操作。由于乘法和除法具有相同的存在性,因此它们从乘法开始。

痕迹:

1/2/3/4*5
Applying * to 5 and 4
Result: 20
Applying / to 20 and 3
Result: 3/20
Applying / to 3/20 and 2
Result: 40/3
Applying / to 40/3 and 1
Result: 3/40

最佳答案

调车场算法中有一个点,就是比较栈顶算子的优先级和输入流中算子的优先级,决定是否出栈(计算入栈算子,在你的情况下),或者推送新的运营商。

如果比较是 < 就会有很大的不同或 <= .其中一个会产生左结合性,另一个会产生右结合性。由于您获得了右关联性并且想要左关联性,所以我猜(没有看到您的代码) 你使用了错误的比较运算符。

顺便说一下,您的教授说得很对。无需显式产生 RPN,评估算法确实会在到达输入末尾时弹出整个堆栈。 (RPN 算法也会这样做;评估算法只是一个捷径。)

关于java - 这是调车院的错还是我的错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778102/

相关文章:

java - JPopupMenu 行为 OSX 10.6.7

java - 用 Java 计算矩阵的零空间基

java - 需要来自整个组合层次结构的数据的操作模式

algorithm - 有没有人有好的 Proper Case 算法

vb.net - ADO - 解析字符串 URL 并使用参数

java - 无法在 java 进程上转储堆

java - Eclipse (Kepler) 中的 Faces 配置架构验证问题

algorithm - 按升序对 "d.mm"和 "dd.mm"日期进行排序

javascript - 用 javascript 编写的搜索表达式解析器

python - 是否有内置或更多 Pythonic 方式来尝试将字符串解析为整数