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

Php 解析到RPN两个方程给出相同的符号,但有不同的答案,php,math,parsing,formulas,Php,Math,Parsing,Formulas,我已经用PHP编写了一个解析器,它根据用户的反馈将表达式的字符串表示形式转换为RPN。在测试时,我发现了两个不同的方程,它们在RPN中解析为同一个东西。因为它们最终在RPN中是相同的东西,当你解决它们时,你会得到相同的答案 3+4*8/(1-5) 3+4*8/1-5 这两个结果都是348*15-/+,当求解时,第一个答案是-5,第二个答案应该是30 那么,我是否误解了如何转换为RPN?我的解析器的代码可以在上面的问题链接中找到。我在您的解析器中发现了错误。在上一个大else块中,需要替换 $cu

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

  • 3+4*8/(1-5)
  • 3+4*8/1-5
  • 这两个结果都是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];
    }
    

    在这个更改之后,您的两个测试用例在这里工作得很好。(我曾经修复过你的代码。在修复了你问题中的问题后,我停止了检查你的代码,所以里面可能有更多的bug——我没有校对所有内容!)


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

    我在解析器中发现了错误。在上一个大
    else
    块中,需要替换

    $current = end($stack);
    if($operators[$tokens[$i]] == $operators[$current]) {
      $rpn .= array_pop($stack);
      $stack[] = $tokens[$i];
    } else {
      $stack[] = $tokens[$i];
    }
    

    在这个更改之后,您的两个测试用例在这里工作得很好。(我曾经修复过你的代码。在修复了你问题中的问题后,我停止了检查你的代码,所以里面可能有更多的bug——我没有校对所有内容!)


    编辑:重要的是用“>=”替换“==”。如果始终只有两级优先级,则严格来说不需要将
    If
    替换为循环。

    是,解析器已损坏。为了帮助您调试:第二个的正确RPN表示形式是:348*1/+5-。您是否以正确的方式设置了运算符的优先顺序?是的,您的解析器已损坏。为了帮助您调试:第二个的正确RPN表示形式是:348*1/+5-。您是否以正确的方式设置了运算符的优先顺序?查看您的链接后,我看到了错误,我以为您只是从堆栈中弹出了最后一个运算符,我不知道你一直弹出操作符直到下一个优先级更低。这并不是打破你的例子的原因,但是:重要的区别是你只弹出优先级相同(=)的操作符,尽管你需要弹出优先级相同且更高(>=)的操作符。查看你的链接后,我看到了我的错误,我以为你只是从堆栈中弹出了最后一个操作符,没有意识到你一直弹出操作符直到下一个优先级更低。这并不是打破你的例子的原因,但是:重要的区别是你只弹出了优先级相同(=)的操作符,尽管你需要弹出优先级相同且更高的操作符(>=)。