2011-12-01 67 views
5

我一直在尋找的維基頁面:http://en.wikipedia.org/wiki/Shunting-yard_algorithm很難理解做什麼用的調度場算法的輸出

我使用的代碼示例建立的第一個部分,基本上我現在可以打開:

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

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

而且示例代碼和解釋上的維基AR對我沒有任何意義。

有人可以解釋如何評估3 4 2 * 1 5 − 2 3^^/+併產生答案。提前致謝。我不需要代碼示例只是一個很好的解釋或示例的細分。

並不重要,但我工作.net C#。

回答

9

的調度場算法的目的是,它的輸出是Reverse Polish Notation,這是簡單的評價:

  • 建立一個堆棧保存值
  • 同時有逆波蘭表示法輸入的左:
    • 讀取輸入的項目
    • 如果它是一個值,則將其推入堆棧
    • 否則,它是一個操作;彈出堆棧中的值,對這些值執行操作,將結果推回
  • 當沒有輸入時,如果表達式格式正確,那麼堆棧中應該只有一個值;這是評估結果。
+0

堆棧是一個合適的數據結構來實現這一點,你會建議在Java中使用(如果你知道)什麼類型的集合?一個LinkedList或Deque?我知道Java有一個Stack 類,但是我讀到它由於同步而無法使用。 – tonix

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

過程中的元件3 4 2 * 1 5 − 2 3^^/+左到右如下:

  1. 初始化棧來保持數字。
  2. 如果元素是數字,請將其推入堆棧。
  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'