Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 必须实现调车场算法,需要帮助理解它_Algorithm_Shunting Yard - Fatal编程技术网

Algorithm 必须实现调车场算法,需要帮助理解它

Algorithm 必须实现调车场算法,需要帮助理解它,algorithm,shunting-yard,Algorithm,Shunting Yard,我试图实现一个没有括号的算法,但我在理解它时遇到了困难。我试过维基百科,但它的词条很糟糕。我在实现代码时应该没有什么问题,但是如果我没有理解,我就无法实现它 现在:这个算法是如何工作的 以下是我的理解: 从左到右,所有数字都添加到输出队列,所有操作数都添加到堆栈。到达末尾后,弹出所有操作数并将其添加到输出中 Expression: 2+5*4+3/5 ( = 2+20+0.6 = 22.6 ) Stack: +*+/ ( -> top ) OutputQu

我试图实现一个没有括号的算法,但我在理解它时遇到了困难。我试过维基百科,但它的词条很糟糕。我在实现代码时应该没有什么问题,但是如果我没有理解,我就无法实现它

现在:这个算法是如何工作的

以下是我的理解:

  • 从左到右,所有数字都添加到输出队列,所有操作数都添加到堆栈。到达末尾后,弹出所有操作数并将其添加到输出中

    Expression: 2+5*4+3/5   ( = 2+20+0.6 = 22.6 )
    
    Stack: +*+/             ( -> top )
    
    OutputQueue: 5 3 4 5 2  ( -> exits)
    
现在我弹出堆栈并将其添加到队列中

    OutputQueue: (insert ->) + * + / 5 3 4 5 2   ( -> exit)
据我所知,表格应该是:25435/+*+

让我们试着解决它:

    5/3 ~ 1.6 + 4 ~= 5.6 * 5 ~= 28 + 2 ~= 30 (or 30.3 recurring .3 if you insist)
编辑:我确信我在这里使用的是正确的,所以这不应该是问题所在

我知道我在做一些愚蠢的事,但我一辈子都搞不懂

我认为如果有人能指出我逻辑中的错误,那将是最有帮助的,因为算法应该是好的,因为它来自维基百科,我看到其他人向我指出了它。所以它必须是好的,我只是在某个地方搞砸了一些事情


是排队吗?我很确定我处理得足够好。

我不太确定你想要的算法有这么简单-你看过你链接到的整个wiki文章吗?具体地说,请参阅“”一节,它涉及很多运算符优先级,我认为您在当前的实现中放弃了运算符优先级。我的建议是,按照要点(并根据需要与下面的示例进行比较)一步一步地浏览该部分,试图为这个问题找到合适的形式。一旦你这样做了,它将有助于你对算法的理解。

你弄错了:

Expression: 2+5*4+3/5 
对于每个令牌:

    token : 2
    outputqueue 2
    stack

    token : +
    outputqueue 2
    stack +

    token : 5
    outputqueue 25
    stack +

    token : "*" 
    "*" has higher predencence as "+", so we push into the stack
    outputqueue 25
    stack +*

    token : 4
    outputqueue 254
    stack +*

    token : "+"
    "+ "has lower predencence as "*", we pop "*" from the stack.
    "+" has same predecence as "+", so we pop "+" from the stack then add the current  token "+" in the stack
    outputqueue 254*+
    stack +

    token : 3
    outputqueue 254*+3
    stack +

    token : "/"
    "/" has lower predencence as "+", we push "/" into the stack
    outputqueue 254*+
    stack +/

    token : 5
    outputqueue 254*+35
    stack +/
表达式结束后,弹出堆栈:

output 254*+35/+

计算:

5*4 = 20
2+20 = 22
3/5 = 0.6
22 + 0.6 = 22.6
您说过:“/”的优先级较低,为“+”,但您正在将“/”推入堆栈。我认为应该是:“/”的优先级高于“+”