我在PHP中编写了一个解析器,它根据来自之前的问题。在测试它时,我发现了两个不同的方程式,它们在RPN中解析相同的东西。因为当你解决它们时,它们在RPN中的结果是相同的,你会得到相同的答案。

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

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

有帮助吗?

解决方案

我在解析器中发现了错误。在您的上一个大 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];

在更改之后,您的两个测试用例在这里工作正常。 (我使用此参考来修复您的代码。我在之后停止检查您的代码解决问题中的问题,因此内部可能存在更多错误 - 我没有证明 - 读取所有内容!)

编辑:重要的是替换“==”使用“> =”。如果你总是只有两个优先级,那么用一个循环替换 if 并不是绝对必要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top