2017-03-08 28 views
1

如何將標準Shunting Yard Algorithm修改爲包含'wall'符號,|,表示函數參數的結尾?也就是說,支持修改後綴符號(Reverse Polish Notation),允許使用任意數量的參數。修改調車圍場算法以包含牆壁操作員|

一對夫婦的改性後綴表示法的例子:

˚F(1,2)9⟶| 1 2 f 9 +
f(1,2,3)+9⟶| 1 2 3 f 9 +

請,我正在尋找實際的修改,而不只是想法如何做到這一點。

調度場算法

  1. 雖然有令牌來閱讀:
  2. 閱讀的令牌。
  3. 如果令牌是一個數字,然後將其推送到輸出隊列。
  4. 如果令牌是功能令牌,則將其推入堆棧。
  5. 如果令牌函數參數分離器(例如,逗號):
    • 直到在堆棧的頂部的標記是一個左括號,彈出操作員從堆棧到輸出隊列。如果沒有遇到左括號,分隔符錯位或括號不匹配。
  6. 如果令牌是一個操作符,O1,則:

    • 同時有一個運算符標記O2,在操作棧的頂部,要麼

      • O1是左聯合,其優先級小於或等於o2的優先級,或者
      • o1是正確關聯的,優先級小於o2,

        -pop o2 off the operator stack,into the output queue;

      • 在迭代結束時將o1推送到運算符堆棧上。
  7. 如果令牌左括號(即, 「(」),然後將其推入到堆棧
  8. 如果令牌右括號(即, 「)」。):
    • 直到堆棧頂部的令牌爲左括號,彈出操作員將堆棧彈出到輸出隊列中。
    • 從堆棧中彈出左括號,但不彈出到輸出隊列中。
    • 如果堆棧頂部的令牌是功能令牌,請將其彈出到輸出隊列中。
    • 如果堆棧用完而沒有找到左括號,則會出現不匹配的括號。
  9. 當沒有更多的標記閱讀:
    • 雖然仍然在堆棧操作標記:
      • 如果在堆棧的頂部的操作令牌是一個括號,然後有不匹配的括號。
      • 將操作員彈出到輸出隊列中。
  10. 退出。
+0

你怎麼知道'f'是一個函數?例如,假設輸入是'| | a b c d'是d(c(a,b))還是'd(b(a),c)'? – rici

+0

對不起,請假定f已經被識別爲一個函數。此外,輸入中綴表達式中沒有變量,只是數字。 – bitsmcgee77

+0

好的。我通常會通過輸出函數,參數,然後計算參數並最終調用運算符來進行函數調用。但是如果你能說出'f'是一個函數,我認爲這將起作用。 – rici

回答

0

解決辦法:

在步驟4中,除了推動功能到堆棧,寫|符號輸出到後綴表達式。

當然,評估這個修改過的後綴表達式的算法本身必須被修改以解釋牆符號。