在C中計算後綴表達式時,如果我們的令牌是運算符,那麼我們必須將它放在堆棧中,使其具有最高的優先級。RPN中運營商的優先級
我的問題是運營商*
,/
,%
,它具有最高優先級。
我們是否需要考慮結合性?由於所有這些運營商都具有從左向右相關性,因此/
會比*
獲得更高的優先級嗎?
在C中計算後綴表達式時,如果我們的令牌是運算符,那麼我們必須將它放在堆棧中,使其具有最高的優先級。RPN中運營商的優先級
我的問題是運營商*
,/
,%
,它具有最高優先級。
我們是否需要考慮結合性?由於所有這些運營商都具有從左向右相關性,因此/
會比*
獲得更高的優先級嗎?
我的問題是運營商
*
,/
,%
,具有最高優先級之間。
它們是相等的,就像+
和-
(二進制)是相等的。
我們是否還需要考慮關聯性?
是,例如1 + 2 + 3
需要成爲(1 + 2) + 3
,即1, 2, ADD, 3, ADD,
而不是1, 2, 3, ADD, ADD.
由於所有這些運營商都左到右結合,過會/獲得更高的優先級*?
關聯性與先例沒有任何關係。這個問題沒有意義。
但是,如果你只是計算現有的RPN表達式,就像你的標題所說的那樣,我不知道你爲什麼要問這些。您只需推動操作數,並在操作員出現時對其進行評估。你真的在問關於翻譯到 RPN嗎?
運營商*
, /
,%
在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 *
是的,我想我的答案很好。謝謝! – KShirish
@KayShree立即閱讀更新回答。 –
優先通常只適用於中綴表示法。後綴(和前綴)符號通常被認爲是明確指定哪些操作數與哪個操作符關聯。優先級僅在解析中存在歧義時才起作用,而後綴符號則不是這種情況。
中出現的中綴表達式
4 * 5 + 3/12
的優先問題根本不轉換之後存在於RPN形式
4 5 * 3 + 12/
或前綴形式
(/ (+ (* 4 5) 3) 12)
。
當考慮像Shunting-Yard Algorithm這樣的東西時,可能會出現混淆,它可用於從中綴表達式生成RPN表示,或直接評估中綴表達式。它通過將操作符推遲到二級堆棧來處理操作符優先級,直到較低優先級操作符強制它被彈出並評估(或輸出)爲止。
你爲什麼不寫一個測試來搞清楚? – Soosh
@AmirNoori什麼測試?你將不得不寫一個所有可能性的詳盡測試。要求基本原則更有意義。 – EJP
等一下......我認爲RPN的意義在於你沒有*運算符優先級。 –