今天才發(fā)現(xiàn)原來有人把操作符優(yōu)先級和執(zhí)行順序混在一起了 ——輪子哥???
舉個例子來說明操作符優(yōu)先級和執(zhí)行順序之間的關系就知道了。
1 + 2 + 3 × 4 = 3 + 3 × 4 = 3 + 12 = 15
乘法優(yōu)先級高于加法,然而先執(zhí)行的是加法運算。
該如何解釋這種現(xiàn)象呢
如果提到波蘭式和逆波蘭式的話,就明白的話,就不用向下看了(逃
逆波蘭表示法(Reverse Polish notation,RPN,或逆波蘭記法),是一種是由波蘭數(shù)學家揚·武卡謝維奇1920年引入的數(shù)學表達式方式,在逆波蘭記法中,所有操作符置于操作數(shù)的后面,因此也被稱為后綴表示法。逆波蘭記法不需要括號來標識操作符的優(yōu)先級。
——喂雞百科
劃重點了,逆波蘭記法不需要括號來標識操作符的優(yōu)先級
也就是說,表達式和運算符優(yōu)先級沒什么關系。括號是用來確定語法樹結構的,而優(yōu)先級的作用就是少寫兩個括號,書寫觀看方便點。
如果還不明白,或者不了解逆波蘭式,再舉個例子就明白了,(懶,直接貼喂雞的Demo了
中綴表達式“5 + ((1 + 2) * 4) ? 3”寫作
5 1 2 + 4 * + 3 ?
下表給出了該逆波蘭表達式從左至右求值的過程,堆棧欄給出了中間值,用于跟蹤算法。
| 輸入 | 操作 | 堆棧 | 注釋 |
|---|---|---|---|
| 5 | 入棧 | 5 | |
| 1 | 入棧 | 5, 1 | |
| 2 | 入棧 | 5, 1, 2 | |
| + | 加法運算 | 5, 3 | (1, 2)出棧;將結果(3)入棧 |
| 4 | 入棧 | 5, 3, 4 | |
| * | 乘法運算 | 5, 12 | (3, 4)出棧;將結果(12)入棧 |
| + | 加法運算 | 17 | (5, 12)出棧;將結果 (17)入棧 |
| 3 | 入棧 | 17, 3 | |
| ? | 減法運算 | 14 | (17, 3)出棧;將結果(14)入棧 |
計算完成時,棧內(nèi)只有一個操作數(shù),這就是表達式的結果:14
上述運算可以重寫為如下運算鏈方法(用于HP的逆波蘭計算器)
1 2 + 4 * 5 + 3 ?