日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

PHP中的逆波兰式应用

發(fā)布時(shí)間:2023/11/29 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。