2012-10-16 96 views
1

我不能解決從後綴到綴此表達式。請幫我詳細地瞭解後綴到綴談話

5 x y -/x y + 3^7/+ 
+0

http://en.wikipedia.org/wiki/Reverse_Polish_notation – 2012-10-16 06:11:50

+0

來自@Grijesh Chauhan的回答無疑是正確的,但我可能知道「不接受」我的答案的原因。它是錯的還是描述性較低?所以,我可以改進它以改善。 – Abhineet

回答

0

後綴到綴:

5 x y -/x y + 3^7/+ 

STEP

5的xy -/
A)5xy-/= 5(XY)/ =(5 /(XY))
XY +
B)的xy + =(X + Y)
(X + Y)3^
B.1)(X + Y)3^=((X + Y)^ 3)
現在,(5 /(XY))((X + Y)^ 3)7/+
=(5 /(XY))(((X + Y)^ 3)/ 7)+ =(5 /(XY))+(((X + Y)^ 3)/ 7)

POSTFIX和PREFIX是表達在其中使用沒有括號。運算符的優先級按表達式出現的順序決定,因此評估表達式不需要搜索下一個操作來執行 - FAST。在運營商的綴表達式優先

雖然通過支架覆蓋。因此括號在中綴表達式中 - 需要搜索要執行的操作,例如,A + B%D - 因此SLOW
這就是轉換在計算機科學中有用的原因。

2

這不是代碼,但方式,你應該擴展後綴,以中綴::

5 XY -/XY + 3^7/+

5(XY)/ XY + 3^7/+

(5 /(XY))XY + 3^7/+

(5 /(XY))(X + Y)3^7/+

(5 /(XY))((X + Y)^ 3)7/+

(5 /(XY))(((X + Y)^ 3)/ 7)+

(5 /(XY))+(((X + Y)^ 3)/ 7)

1

它是相當直截了當:

  1. 您讀取的參數,並決定是否它是一個值或一個變量。如果是這樣,你可以在棧上推送參數。如果不是它是一個操作員。
  2. 如果你有一個運營商,創建由操作員爲根,堆作爲其子的許多參數的樹。你推動堆棧上的樹。
  3. 當你想打印你做的堆棧的頂部的有序散步中間符號(原定位後的符號僅僅是同一棵樹的後序的步行路程)。

在C處理這個++我創建一個基類(Expression)與派生類代表不同類型的節點(ValueVariable,和BinaryOperation)的和保持std::stack<std::shared_ptr<Expression>>。編碼這主要是打字練習。

+0

與其他答案相比,您提供了更通用的方法,因此可以用於應對任何後綴表示法。 –

+0

上面的答案只是給出的表達式的轉換,而這個答案是進行轉換的實際方式和邏輯。比我的好。應該被接受。 – Abhineet