这是Shunting Yard的错还是我自己的错?

时间:2013-11-04 22:04:04

标签: 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

2 个答案:

答案 0 :(得分:2)

在分流码算法中有一点可以比较堆栈顶部运算符的优先级和输入流中运算符的优先级,并决定是否弹出堆栈(评估堆栈运算符) ,在您的情况下),或推新操作员。

如果比较为<<=,则会产生很大的不同。其中一个会产生左倾相关性,另一个会产生右倾相关性。由于你正在获得正确的关联性而你想要左倾相关性,我猜测(没有看到你的代码) 你正在使用错误的比较运算符。

顺便说一下,你的教授是非常正确的。无需显式生成RPN,评估算法在到达输入结束时确实会弹出整个堆栈。 (RPN算法也会这样做;评估算法只是一个捷径。)

答案 1 :(得分:1)

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