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