这是调车场的错还是我自己的错?



给定表达式:

 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 算法也可以做到这一点;评估算法只是一个捷径。

What operatorStack?由分流场算法产生的 RPN 是一个列表,而不是一个堆栈。它是从左到右处理的,而不是FIFO,

相关内容

  • 没有找到相关文章

最新更新