解析到RPN两个方程给出相同的符号但有不同的答案

时间:2009-11-27 12:40:19

标签: php math parsing formulas

我在PHP中编写了一个解析器,它根据earlier question的反馈将方程的字符串表示转换为RPN。在测试它时,我发现了两个不同的方程式,它们在RPN中解析相同的东西。因为当你解决它们时,它们在RPN中的结果是相同的,你会得到相同的答案。

  1. 3 + 4 * 8 /(1-5)
  2. 3 + 4 * 8 / 1-5
  3. 两者最终都是348 * 15 - / +当得到解决时给出-5的答案,这对第一个答案是正确的,但第二个答案应该是30。

    所以我误解了如何转换为RPN?我的解析器的代码可以在上一个问题的链接中找到。

1 个答案:

答案 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