在程序開(kāi)發(fā)中我們都是使用中綴表達(dá)式例如:
? ? 3?× 2 +1?÷ ( 6÷3) - 7?
運(yùn)算符都是在兩個(gè)操作數(shù)的中間部分握爷,而計(jì)算機(jī)通常使用的是后綴表達(dá)式;那什么是后綴表達(dá)式呢狠轻,舉例說(shuō)明奸例,我們知道在數(shù)學(xué)運(yùn)算中是有優(yōu)先級(jí)的,一般是帶有括號(hào)的優(yōu)先級(jí)最高向楼,然后是乘除法查吊,之后再是加減法,而計(jì)算機(jī)為了提高效率湖蜕,會(huì)把數(shù)字放在運(yùn)算符的前面逻卖,例如:3?× 2 則變成 32*,在計(jì)算的時(shí)候就把運(yùn)算符前面兩個(gè)數(shù)相乘就是要得到的結(jié)果昭抒,這就是后綴表達(dá)式评也。通俗的講后綴表達(dá)式是在計(jì)算機(jī)運(yùn)算符放置操作數(shù)的后面的轉(zhuǎn)換,大概就是這個(gè)意思灭返,但是他也有一定規(guī)則在里面盗迟。
我們先講一下轉(zhuǎn)換的一個(gè)規(guī)則,然后我們套用規(guī)則把他轉(zhuǎn)換成后綴表達(dá)式熙含,規(guī)則如下:
1.遇到數(shù)字直接輸出
2.遇到運(yùn)算符直接入棧罚缕;有人可能就不有點(diǎn)聽(tīng)不太懂了,怎么扯上棧了呢怎静,其實(shí)在轉(zhuǎn)換過(guò)程中就是利用了堆棧邮弹,他內(nèi)部創(chuàng)建了一個(gè)堆棧黔衡,用來(lái)存儲(chǔ)運(yùn)算符,根據(jù)優(yōu)先級(jí)進(jìn)行進(jìn)棧出棧腌乡;我們看一下運(yùn)算符都有哪些:()、× 与纽、÷侣签、 +急迂、- 下面我們講一下進(jìn)棧出棧的規(guī)則
? ? (1).如果棧里面為空袋毙,那運(yùn)算符直接入棧,如果棧里面有運(yùn)算符冗尤,就跟棧頂?shù)倪\(yùn)算符比較誰(shuí)的優(yōu)先級(jí)高听盖,如果比棧頂?shù)膬?yōu)先級(jí)高就直接入棧,如果優(yōu)先級(jí)高就直接出棧頂在入棧
? ? ? (2).如果遇到小括號(hào)就把棧中小括號(hào)包含的的運(yùn)算符逐個(gè)出棧裂七,小括號(hào)不輸出皆看,只輸出運(yùn)算符? ??
? ? ? (3).如果遇到優(yōu)先級(jí)同級(jí)的也要入棧
下面我就套用上面的規(guī)則,轉(zhuǎn)換后綴表達(dá)式的結(jié)果是:3 2 * 1 6 3 / / 7 - +
那計(jì)算機(jī)是怎么計(jì)算的呢:
第一步把3和2相乘的6之后輸出為6背零;那第一步運(yùn)算的結(jié)果為:6 1 6 3 / / 7 - +
第二部把6和3相除輸出2腰吟,結(jié)果為:6 1 2 / 7 - +
第三步把1和2相除為0.5,結(jié)果為:6? 0.5? 7 - +?
第四步把0.5和7相減為-6.5徙瓶,結(jié)果為:6? -6.5? +
第五步把6和-6.5相加毛雇,結(jié)果為:-0.5
那我們計(jì)算一下? 3?× 2 +1?÷ ( 6÷3) - 7 的結(jié)果就是 -0.5
注意每次計(jì)算是拿著運(yùn)算符前面兩個(gè)數(shù)進(jìn)行運(yùn)算,然后輸出結(jié)果
到這里想必有人已經(jīng)明白了計(jì)算機(jī)的是怎么計(jì)算的侦镇,但是有沒(méi)有人有疑問(wèn)灵疮,這個(gè)后綴表達(dá)式:3 2 *?1 6 3 / / 7 - +??是怎么得出來(lái)的,怎么回事這個(gè)樣子呢壳繁,接下來(lái)我們就一步一步分析他是怎么得出來(lái)的結(jié)果震捣,我畫(huà)了一張圖,里面詳細(xì)介紹了每一步都轉(zhuǎn)換過(guò)程