2012-03-07 32 views
1

所以我編寫了一個基於cmd的C++計算器。我完成了它,但我想知道,在將中綴轉換爲後綴後,我有一個隊列稱爲包含運算符/操作數的後綴隊列,順序正確。如何將後綴表達式轉換回中綴?C++將Postfix轉換爲中綴

+4

由於這兩個表示之間沒有雙射映射,因此無法將其「返回」爲中綴。意思是說,幾個中綴表達式可能產生相同的後綴表達式,並且沒有辦法說哪一個是原始表達式。你所能做的就是轉換成「一些」中綴表達式。 – 2012-03-07 23:26:49

回答

1

如果你不介意產生一些額外的括號,它應該很容易。你基本上像往常一樣「評估」後綴數據,除了當你到達一個操作符時,不是評估該操作符並將結果推送到堆棧上,而是打印出一個開放頁面,第一個操作數,操作符,第二個操作數,最後是一個近親。

如果您不介意更改順序,避免多餘的括號也很容易。將表情向後走,重新排列operator operand operandoperand operator operand。如果遇到需要操作數的操作符,則可以使用子表達式來打印輸出。當且僅當其運算符的優先級低於先前遇到的運算符時,才需要將該子表達式括在括號中。例如,考慮:a b + c *。走這個倒退,我們得到*,然後c,所以我們開始打印出c *。然後我們需要另一個操作數,但我們有一個+,所以我們有一個子表達式。由於+的優先級低於*,因此我們需要將該子表達式括在括號內,所以我們得到c * (b + a)

反過來說,如果我們有:a b * c +,我們會同樣開始,生產c +,但後來因爲*更高優先級是+,我們可以/可以打印出a * b(或b * a)沒有括號。

請注意,使用-/(或其他任何不可交換的東西),您必須更仔細地確定操作數的順序。即便如此,你也不會獲得原始表達式,只是一個表達式應該在邏輯上等同於它。