给定表达式:
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/