必须实现Shunting-yard算法,需要帮助理解它

时间:2012-06-11 11:03:06

标签: algorithm shunting-yard

我正在尝试实现一个没有括号的Shunting-yard算法,但我无法理解它。我试过维基百科,但条目非常糟糕。我应该在实现代码时遇到一些问题,但是如果我没有得到,我就无法实现它。

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

以下是我的理解:

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

    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)

编辑:我确信我在这里使用的Reverse Polish notation是正确的,所以这不应该是问题。

我知道我做的事情很愚蠢,但对于我的生活,我无法理解。

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

是队列吗?我很确定我正在处理Reverse Polish notation

2 个答案:

答案 0 :(得分:3)

你弄错了:

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

答案 1 :(得分:2)

我不太确定你想要的算法就这么简单 - 你读过你链接的整个wiki文章吗?具体来说,请参阅“The algorithm in detail”部分,其中涉及运算符优先级,我认为您在当前的实现中放弃了这一优先级。我的建议是按照项目符号(并根据需要与下面的示例进行比较)一步一步地完成该部分的步骤,以尝试为此问题提出正确的表格。一旦你完成了它,它应该有助于你理解算法。