今天才發(fā)現(xiàn)原來有人把操作符優(yōu)先級(jí)和執(zhí)行順序混在一起了 ——輪子哥???
舉個(gè)例子來說明操作符優(yōu)先級(jí)和執(zhí)行順序之間的關(guān)系就知道了。
1 + 2 + 3 × 4 = 3 + 3 × 4 = 3 + 12 = 15
乘法優(yōu)先級(jí)高于加法舀锨,然而先執(zhí)行的是加法運(yùn)算岭洲。
該如何解釋這種現(xiàn)象呢
如果提到波蘭式和逆波蘭式的話,就明白的話雁竞,就不用向下看了(逃
逆波蘭表示法(Reverse Polish notation钦椭,RPN,或逆波蘭記法)碑诉,是一種是由波蘭數(shù)學(xué)家揚(yáng)·武卡謝維奇1920年引入的數(shù)學(xué)表達(dá)式方式彪腔,在逆波蘭記法中,所有操作符置于操作數(shù)的后面进栽,因此也被稱為后綴表示法德挣。逆波蘭記法不需要括號(hào)來標(biāo)識(shí)操作符的優(yōu)先級(jí)。
——喂雞百科
劃重點(diǎn)了快毛,逆波蘭記法不需要括號(hào)來標(biāo)識(shí)操作符的優(yōu)先級(jí)
也就是說格嗅,表達(dá)式和運(yùn)算符優(yōu)先級(jí)沒什么關(guān)系番挺。括號(hào)是用來確定語(yǔ)法樹結(jié)構(gòu)的,而優(yōu)先級(jí)的作用就是少寫兩個(gè)括號(hào)屯掖,書寫觀看方便點(diǎn)玄柏。
如果還不明白,或者不了解逆波蘭式贴铜,再舉個(gè)例子就明白了粪摘,(懶,直接貼喂雞的Demo了
中綴表達(dá)式“5 + ((1 + 2) * 4) ? 3”寫作
5 1 2 + 4 * + 3 ?
下表給出了該逆波蘭表達(dá)式從左至右求值的過程绍坝,堆棧欄給出了中間值徘意,用于跟蹤算法。
輸入 | 操作 | 堆棧 | 注釋 |
---|---|---|---|
5 | 入棧 | 5 | |
1 | 入棧 | 5, 1 | |
2 | 入棧 | 5, 1, 2 | |
+ | 加法運(yùn)算 | 5, 3 | (1, 2)出棧轩褐;將結(jié)果(3)入棧 |
4 | 入棧 | 5, 3, 4 | |
* | 乘法運(yùn)算 | 5, 12 | (3, 4)出棧椎咧;將結(jié)果(12)入棧 |
+ | 加法運(yùn)算 | 17 | (5, 12)出棧;將結(jié)果 (17)入棧 |
3 | 入棧 | 17, 3 | |
? | 減法運(yùn)算 | 14 | (17, 3)出棧把介;將結(jié)果(14)入棧 |
計(jì)算完成時(shí)勤讽,棧內(nèi)只有一個(gè)操作數(shù),這就是表達(dá)式的結(jié)果:14
上述運(yùn)算可以重寫為如下運(yùn)算鏈方法(用于HP的逆波蘭計(jì)算器)
1 2 + 4 * 5 + 3 ?