2008-09-02 46 views
1

我相信自己不能。是否所有的RPN表達式都可以表示爲所有的操作符出現在左側,而所有的操作數出現在右側?

採取例如:

4 4 + 4/

堆棧:4 堆棧:4 4 4 + 4 = 8 堆棧:8 堆棧:8 4 8/4 = 2 堆棧:2

還有,你可以寫與 相同符和操作數,使得所有的操作數來先上述表達式兩種方式:「4 4 4 + /」和「4 4 4/+」,這兩者都不評價爲2

「4 4 4 + /」 堆棧:4 堆棧:4 4 堆棧:4 4 4 4 + 4 = 8 堆棧:4 8 4 /8 = 0.5 堆棧:0.5

「4 4 4/+」 堆棧:4 堆棧:4 4 堆棧:4 4 4 4/4 = 1 堆棧:4 1 4 + 1 = 5 堆疊:5

如果你有能力在棧上交換物品,那麼是的,這是可能的,否則,不。

想法?

回答

2

考慮代數表達式:

(a + b) * (c + d) 

明顯的翻譯RPN是:

a b + c d + * 

即使交換操作可用,我不認爲有一種方式來收集所有右側的運營商:

a b c d + 
a b S 

其中S是c和d的總和。此時,您無法使用單個交換操作爲a操作同時獲取a和b。相反,您需要更復雜的堆棧操作(例如roll)才能將a和b放在正確的位置。我不知道一個滾動操作是否足以滿足所有情況。

0

這是足以顯示一個不能爲了告訴你這個答案。

如果您無法重新排序堆棧內容,則無法重新排列表達式(2 + 4)*(7 + 8)。

2 4 + 7 + 8 *

不管你怎麼這個重新排序,你會的東西需要被概括你走之前結束。

至少我是這麼認爲的。

1

實際上,您不僅僅通過一個反例來證明標題中暗示的假設,而且還提供了一個確鑿的證據。

1

我知道這是一個非常古老的線程,但我今天才發現它,並且想說我相信原始問題的答案是YES。我相信所有的RPN表達式都可以表示爲所有的操作符都出現在左邊,所有的操作數都出現在右邊,如果除了正常的算術運算,我們允許在表示中包含三個額外的「導航」操作符。

任何算術表達式都可以表示爲二叉樹,在葉節點處具有變量和常量,在樹中叉具有二進制算術運算,以及沿任何分支的一元運算(例如否定,倒數或平方根)。我建議的三個額外的操作表示構建左分支,構建右分支或到達二叉樹中的葉節點。現在,如果我們根據樹中各個葉子的位置將所有操作數放在輸入字符串的左側,我們可以提供輸入字符串的其餘部分,並告訴操作如何重建內存中適當的二叉樹,並插入操作數和數學運算進入正確的點。最後,應用深度優先樹遍歷算法來計算結果。

我不知道這是否有任何實際應用。對錶達式進行編碼和解碼可能效率太低。但作爲學術演習,我相信這是可行的。

相關問題