我在PHP中编写了一个解析器,它根据earlier question的反馈将方程的字符串表示转换为RPN。在测试它时,我发现了两个不同的方程式,它们在RPN中解析相同的东西。因为当你解决它们时,它们在RPN中的结果是相同的,你会得到相同的答案。
两者最终都是348 * 15 - / +当得到解决时给出-5的答案,这对第一个答案是正确的,但第二个答案应该是30。
所以我误解了如何转换为RPN?我的解析器的代码可以在上一个问题的链接中找到。
答案 0 :(得分:1)
我在解析器中发现了错误。在您的上一个大else
块中,您需要替换
$current = end($stack);
if($operators[$tokens[$i]] == $operators[$current]) {
$rpn .= array_pop($stack);
$stack[] = $tokens[$i];
} else {
$stack[] = $tokens[$i];
}
与
while(!empty($stack) && end($stack) != '(' && $operators[$tokens[$i]] >= $operators[end($stack)]) {
$rpn .= array_pop($stack);
}
$stack[] = $tokens[$i];
在更改之后,您的两个测试用例在这里工作正常。 (我使用this reference来修复你的代码。我在你的问题中解决了问题后停止检查你的代码,所以里面可能会有更多的错误 - 我没有证明 - 读取所有内容!)
编辑:重要的是将“==”替换为“> =”。如果您始终只有两个优先级,则不必使用循环替换if
。