PHP中的逆波兰式应用
生活随笔
收集整理的這篇文章主要介紹了
PHP中的逆波兰式应用
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
定義
逆波蘭式(Reverse Polish notation,RPN,或逆波蘭記法),也叫后綴表達(dá)式(將運(yùn)算符寫(xiě)在操作數(shù)之后)?如:我們平時(shí)寫(xiě)a+b,這是中綴表達(dá)式,寫(xiě)成后綴表達(dá)式就是:ab+?
(a+b)*c-(a+b)/e的后綴表達(dá)式為:?
(a+b)*c-(a+b)/e?
→((a+b)*c)((a+b)/e)-?
→((a+b)c*)((a+b)e/)-?
→(ab+c*)(ab+e/)-?
→ab+c*ab+e/-
算法實(shí)現(xiàn)
將一個(gè)普通的中序表達(dá)式轉(zhuǎn)換為逆波蘭表達(dá)式的一般算法是:(1)首先構(gòu)造一個(gè)運(yùn)算符棧,此運(yùn)算符在棧內(nèi)遵循越往棧頂優(yōu)先級(jí)越高的原則。
(2)讀入一個(gè)用中綴表示的簡(jiǎn)單算術(shù)表達(dá)式,為方便起見(jiàn),設(shè)該簡(jiǎn)單算術(shù)表達(dá)式的右端多加上了優(yōu)先級(jí)最低的特殊符號(hào)“#”。
(3)從左至右掃描該算術(shù)表達(dá)式,從第一個(gè)字符開(kāi)始判斷,如果該字符是數(shù)字,則分析到該數(shù)字串的結(jié)束并將該數(shù)字串直接輸出。
(4)如果不是數(shù)字,該字符則是運(yùn)算符,此時(shí)需比較優(yōu)先關(guān)系。
做法如下:將該字符與運(yùn)算符棧頂?shù)倪\(yùn)算符的優(yōu)先關(guān)系相比較。如果,該字符優(yōu)先關(guān)系高于此運(yùn)算符棧頂?shù)倪\(yùn)算符,則將該運(yùn)算符入棧。倘若不是的話(huà),則將棧頂?shù)倪\(yùn)算符從棧中彈出,直到棧頂運(yùn)算符的優(yōu)先級(jí)低于當(dāng)前運(yùn)算符,將該字符入棧。
(5)重復(fù)上述操作(1)-(2)直至掃描完整個(gè)簡(jiǎn)單算術(shù)表達(dá)式,確定所有字符都得到正確處理,我們便可以將中綴式表示的簡(jiǎn)單算術(shù)表達(dá)式轉(zhuǎn)化為逆波蘭表示的簡(jiǎn)單算術(shù)表達(dá)式。
逆波蘭式的作用
對(duì)于實(shí)現(xiàn)逆波蘭式算法,難度并不大,但為什么要將看似簡(jiǎn)單的中序表達(dá)式轉(zhuǎn)換為復(fù)雜的逆波蘭式?原因就在于這個(gè)簡(jiǎn)單是相對(duì)人類(lèi)的思維結(jié)構(gòu)來(lái)說(shuō)的,對(duì)計(jì)算機(jī)而言中序表達(dá)式是非常復(fù)雜的結(jié)構(gòu)。相對(duì)的,逆波蘭式在計(jì)算機(jī)看來(lái)卻是比較簡(jiǎn)單易懂的結(jié)構(gòu)。因?yàn)橛?jì)算機(jī)普遍采用的內(nèi)存結(jié)構(gòu)是棧式結(jié)構(gòu),它執(zhí)行先進(jìn)后出的順序。下面以(a+b)*c為例子進(jìn)行說(shuō)明:
(a+b)*c的逆波蘭式為ab+c*,假設(shè)計(jì)算機(jī)把a(bǔ)b+c*按從左到右的順序壓入棧中,并且按照遇到運(yùn)算符就把棧頂兩個(gè)元素出棧,執(zhí)行運(yùn)算,得到的結(jié)果再入棧的原則來(lái)進(jìn)行處理,那么ab+c*的執(zhí)行結(jié)果如下:
1)a入棧(0位置)
2)b入棧(1位置)
3)遇到運(yùn)算符“+”,將a和b出棧,執(zhí)行a+b的操作,得到結(jié)果d=a+b,再將d入棧(0位置)
4)c入棧(1位置)
5)遇到運(yùn)算符“*”,將d和c出棧,執(zhí)行d*c的操作,得到結(jié)果e,再將e入棧(0位置)
經(jīng)過(guò)以上運(yùn)算,計(jì)算機(jī)就可以得到(a+b)*c的運(yùn)算結(jié)果e了。
逆波蘭式除了可以實(shí)現(xiàn)上述類(lèi)型的運(yùn)算,它還可以派生出許多新的算法,數(shù)據(jù)結(jié)構(gòu),這就需要靈活運(yùn)用了。逆波蘭式只是一種序列體現(xiàn)形式。
程序?qū)崿F(xiàn)
轉(zhuǎn)載于:https://blog.51cto.com/caixia/772433
總結(jié)
以上是生活随笔為你收集整理的PHP中的逆波兰式应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 做梦梦到好多玉米棒子好不好
- 下一篇: 【转】主流PHP框架间的比较(Zend