无法理解如何处理分流码算法的输出

时间:2011-12-01 16:08:08

标签: algorithm shunting-yard postfix-notation

我一直在查看维基页面:http://en.wikipedia.org/wiki/Shunting-yard_algorithm

我已经使用代码示例来构建第一部分,基本上我现在可以转向:

3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3加入3 4 2 * 1 5 − 2 3 ^ ^ / +

但我不知道如何使用3 4 2 * 1 5 − 2 3 ^ ^ / +获取3.00012207

wiki上的示例代码和解释对我没有任何意义。

有人可以解释如何评估3 4 2 * 1 5 − 2 3 ^ ^ / +并提出答案。提前致谢。我不需要代码示例只是一个很好的解释或示例的细分。

不重要但我正在工作.net C#。

4 个答案:

答案 0 :(得分:9)

分流码算法的目的是它的输出是Reverse Polish Notation,这很容易评估:

  • 创建一个堆栈来保存值
  • 虽然还有反向抛光符号输入:
    • 阅读输入项目
    • 如果是值,则将其推入堆栈
    • 否则,这是一个操作;从堆栈中弹出值,对这些值执行操作,推回结果
  • 当没有输入时,如果表达式形成良好,堆栈上应该只有一个值;这是评估结果。

答案 1 :(得分:8)

修复后的表示法是您在HP计算器中进行数学计算的方法。

保持筹码,每当你得到一个数字时,将其添加到顶部。每当你让操作员从顶部消耗输入然后将结果添加到顶部

token stack
      *empty*
 3    3         //push numbers...
 4    3 4
 2    3 4 2
 *    3 8       //remove 4 and 2, add 4*2=8
 1    3 8 1
 5    3 8 1 5
 -    3 8 -4
 2    3 8 -4 2
 3    3 8 -4 2 3
 ^    3 8 -4 8
 ...    ...

答案 2 :(得分:2)

从左到右处理元素3 4 2 * 1 5 − 2 3 ^ ^ / +,如下所示:

  1. 初始化堆栈以保存数字。
  2. 如果元素是数字,请将其推入堆栈。
  3. 如果元素是运算符,则从堆栈中删除前两个元素,将运算符应用于这两个元素,然后将结果推送到堆栈中。
  4. 当你到达目的地时,堆栈应该有一个元素,这将是结果。

答案 3 :(得分:2)

我看到我有点迟到了。

我看到了这个问题,并为Rosetta Code编写了几个任务。事实恰恰相反,this task可能就是你所追求的。它给出了一个关于在计算RPN表达式的值时会发生什么情况的表格,表示令牌。

以下是其输出的示例:

For RPN expression: '3 4 2 * 1 5 - 2 3 ^ ^ / +'

TOKEN           ACTION                 STACK      
3     Push num onto top of stack 3                
4     Push num onto top of stack 3 4              
2     Push num onto top of stack 3 4 2            
*     Apply op to top of stack   3 8              
1     Push num onto top of stack 3 8 1            
5     Push num onto top of stack 3 8 1 5          
-     Apply op to top of stack   3 8 -4           
2     Push num onto top of stack 3 8 -4 2         
3     Push num onto top of stack 3 8 -4 2 3       
^     Apply op to top of stack   3 8 -4 8         
^     Apply op to top of stack   3 8 65536        
/     Apply op to top of stack   3 0.0001220703125
+     Apply op to top of stack   3.0001220703125  

 The final output value is: '3.0001220703125'