2013-08-21 46 views
2

在C中計算後綴表達式時,如果我們的令牌是運算符,那麼我們必須將它放在堆棧中,使其具有最高的優先級。RPN中運營商的優先級

我的問題是運營商*/,%,它具有最高優先級。

我們是否需要考慮結合性?由於所有這些運營商都具有從左向右相關性,因此/會比*獲得更高的優先級嗎?

+0

你爲什麼不寫一個測試來搞清楚? – Soosh

+2

@AmirNoori什麼測試?你將不得不寫一個所有可能性的詳盡測試。要求基本原則更有意義。 – EJP

+4

等一下......我認爲RPN的意義在於你沒有*運算符優先級。 –

回答

0

我的問題是運營商*/%,具有最高優先級之間。

它們是相等的,就像+-(二進制)是相等的。

我們是否還需要考慮關聯性?

是,例如1 + 2 + 3需要成爲(1 + 2) + 3,即1, 2, ADD, 3, ADD,而不是1, 2, 3, ADD, ADD.

由於所有這些運營商都左到右結合,過會/獲得更高的優先級*?

關聯性與先例沒有任何關係。這個問題沒有意義。

但是,如果你只是計算現有的RPN表達式,就像你的標題所說的那樣,我不知道你爲什麼要問這些。您只需推動操作數,並在操作員出現時對其進行評估。你真的在問關於翻譯 RPN嗎?

+0

@GrijeshChauhan第二個答案?你在說什麼? – EJP

+0

如果你注意到有問題,我通過詞後綴表達式混淆了第二點,你已經給了後綴相當於'1 + 2 + 3'是'1 2 + 3 +'並且爲此回答你的回答:) –

+0

@GrijeshChauhan你意思是「1,2,ADD,3,ADD'部分?如果是這樣,爲什麼不這樣說呢?如果不是,我仍然不知道你在說什麼。 – EJP

3

運營商*, /,%precedence相同,並且存在相關性從左到右。所以像的表達式:

a * b/c   /* both operators have same precedence */ 

是相同:

(a * b)/c 

同樣的表達式所示:

a/b * c   /* both operators have same precedence */ 

是相同:

(a/b) * c 

因此,即使操作者是相同的優先權,但假設他們出現在一個表達式中(沒有括號),那麼大多數運算符由於從左到右的關聯性而具有更高的優先級。

注意從概念上講,我們使用括號中的表達式來覆蓋操作符的優先,所以雖然表情:a/b * c是一樣的:(a/b) * c但我們可以強制首先使用()通過編寫表達a/(b * c)評估*。我的意思是說如果在編寫代碼時使用括號,如果在運算符優先級上有混淆。

編輯:

在Postfix和PREFIX形式不使用括號()。運算符的優先順序決定於表達式中出現的順序,所以在評估表達式時它不需要搜索下一個操作來執行 - 因此評估快速變爲

雖然在INFIX表達式中運算符的優先級可以被括號()覆蓋。因此括號在中綴表達式中 - 並且它需要搜索下一個要執行的操作。 a + b%d - 並且表達的評估是
這就是轉換在計算機科學中有用的原因。

因此,編譯器首先將中綴表達式轉換爲等效後綴形式(使用語法規則),然後生成目標代碼以評估表達式值。這就是我們研究後綴和前綴形式的原因。

並根據優先級和結合規則下面的表達式:

a * b/c   /* both operators have same precedence */ 

將轉化爲:

a b * c/

和表達

a/b * c   /* both operators have same precedence */ 

將被翻譯成

a b/c * 
+1

是的,我想我的答案很好。謝謝! – KShirish

+0

@KayShree立即閱讀更新回答。 –

7

優先通常只適用於中綴表示法。後綴(和前綴)符號通常被認爲是明確指定哪些操作數與哪個操作符關聯。優先級僅在解析中存在歧義時才起作用,而後綴符號則不是這種情況。

中出現的中綴表達式

4 * 5 + 3/12 

的優先問題根本不轉換之後存在於RPN形式

4 5 * 3 + 12/

或前綴形式

(/ (+ (* 4 5) 3) 12) 

當考慮像Shunting-Yard Algorithm這樣的東西時,可能會出現混淆,它可用於從中綴表達式生成RPN表示,或直接評估中綴表達式。它通過將操作符推遲到二級堆棧來處理操作符優先級,直到較低優先級操作符強制它被彈出並評估(或輸出)爲止。