算法基礎(chǔ) - 棧的應(yīng)用之四則運(yùn)算表達(dá)式求值

計(jì)算 9 + (3-1) * 3 + 10/2
這是一個(gè)很簡單的題目 我們心算也能很快得出答案
但是如果要用程序來實(shí)現(xiàn) 就不是很好處理了

這里面的困難就在于乘除在加減的后面 烙丛, 卻要先運(yùn)算绿聘, 而加入的括號(hào)之后就變得更加復(fù)雜

但仔細(xì)觀察后發(fā)現(xiàn), 括號(hào)都是成對(duì)出現(xiàn)的 有左括號(hào)就一定有右括號(hào) , 對(duì)于多重括號(hào)最終也是可以完全嵌套匹配
這用棧結(jié)構(gòu)正好合適 只要碰到左括號(hào) 咧党,就將此左括號(hào)進(jìn)棧 而后面出現(xiàn)右括號(hào)時(shí),就讓棧頂?shù)淖罄ㄌ?hào)出棧
期間讓數(shù)字運(yùn)算 這樣,最終有括號(hào)的表達(dá)式從左到右巡查一遍 棧應(yīng)該是由空到有元素 在到完全匹配成為空棧

但對(duì)于四則運(yùn)算 荞下,括號(hào)也只是當(dāng)中的一部分 先乘除后加減使得問題依然復(fù)雜
波蘭科學(xué)家想到了一種不需要括號(hào)的后綴表達(dá)式 , 我們也把它稱為逆波蘭
這種后綴表達(dá)式是一種新的顯示方式
我們用上面的題目來看看
正常輸血表達(dá)式 9 + (3-1) * 3 + 10/2
后綴表達(dá)式 9 3 1 - 3 * + 10 2 / +
所有的符號(hào)都是在要運(yùn)算的數(shù)字的后面出現(xiàn)

后綴表達(dá)式的計(jì)算結(jié)果

計(jì)算規(guī)則
從左到右遍歷表達(dá)式的每個(gè)數(shù)字和符號(hào) 遇到數(shù)字就進(jìn)棧 遇到符號(hào)就將處于棧頂?shù)膬蓚€(gè)數(shù)字出棧 進(jìn)行運(yùn)算 運(yùn)算結(jié)果進(jìn)棧 一直到最終獲得結(jié)果

  1. 初始化一個(gè)空棧 用來對(duì)要運(yùn)算的數(shù)字進(jìn)出使用
  2. 表達(dá)式前三個(gè)都是數(shù)字 所以 9 3 1 進(jìn)棧
    此時(shí)棧為 1 3 9
  3. 接下來是 - 將 1 出棧作為減數(shù) 3 出棧作為被減數(shù) 進(jìn)行運(yùn)算得到結(jié)果2 進(jìn)棧
    此時(shí)棧為 2 9
    4 接著是 3 進(jìn)棧
    此時(shí)棧為 3 2 9
    5 后面是 * 號(hào) 將3出棧作為乘數(shù) 2 出棧作為被乘數(shù) 得到結(jié)果 6 進(jìn)棧
    此時(shí)棧為 6 9
    6 接著是 + 將6 9 出棧 得到結(jié)果 15 進(jìn)棧
    此時(shí)棧為 15
    7 10 2 進(jìn)棧
    此時(shí)棧為 2 10 15
    8 遇見 / 2 10 出棧 得到結(jié)果5 進(jìn)棧
    此時(shí)棧為 5 15
    9 最后是 + 5 15 出棧得到結(jié)果 20 進(jìn)棧
    此時(shí)棧為 20

表達(dá)式結(jié)束得到結(jié)果 20

中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

我們把平時(shí)所用的標(biāo)準(zhǔn)四則表達(dá)式稱為 中綴表達(dá)式
中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式規(guī)則
從左到右遍歷中綴表達(dá)式的每個(gè)數(shù)字和符號(hào) 若是數(shù)字就輸出 史飞,即成為后綴表達(dá)式的一部分
若是符號(hào) 尖昏, 則判斷其與棧頂符號(hào)的優(yōu)先級(jí) 是右括號(hào)或優(yōu)先級(jí)不高于棧頂符號(hào) 則棧頂元素依次出棧并輸出 ,并將當(dāng)前符號(hào)進(jìn)棧

還是拿 9 + (3-1) * 3 + 10/2 舉例

1 初始化一空棧
2 第一個(gè)數(shù)字是9 直接加入后綴表達(dá)式 接著是 + 進(jìn)棧
此時(shí)棧為 + 后綴表達(dá)式 9
3 左括號(hào) ( 進(jìn)棧
此時(shí)棧為 ( + 后綴表達(dá)式 9
4 3 是數(shù)字 直接加入后綴表達(dá)式
此時(shí)棧為 ( + 后綴表達(dá)式 9 3
5 - 進(jìn)棧
此時(shí)棧為 - ( + 后綴表達(dá)式 9 3
6 1 加入后綴表達(dá)式
此時(shí)棧為 - ( + 后綴表達(dá)式 9 3 1
7 ) 右括號(hào)需要去匹配 棧里的第一個(gè)左括號(hào) 并將中間符號(hào)出棧
此時(shí)棧為 + 后綴表達(dá)式 9 3 1 -
8 * 優(yōu)先級(jí)高于棧頂?shù)?+ 進(jìn)棧
此時(shí)棧為 * + 后綴表達(dá)式 9 3 1 -
9 3 是數(shù)字 直接出棧
此時(shí)棧為 * + 后綴表達(dá)式 9 3 1 - 3
10 + 優(yōu)先級(jí)低于 棧頂?shù)?* 并且棧里的+ 優(yōu)先級(jí)也不低于當(dāng)前的+ 所以 * + 出棧 + 入棧
此時(shí)棧為 + 后綴表達(dá)式 9 3 1 - 3 * +
11 10 數(shù)字 直接加入后綴表達(dá)式
此時(shí)棧為 + 后綴表達(dá)式 9 3 1 - 3 * + 10
11 / 優(yōu)先級(jí)高于 棧里的 + 進(jìn)棧
此時(shí)棧為 / + 后綴表達(dá)式 9 3 1 - 3 * + 10
12 2 是數(shù)字 直接加入后綴表達(dá)式
此時(shí)棧為 / + 后綴表達(dá)式 9 3 1 - 3 * + 10 2
13 中綴表達(dá)式已經(jīng)到了尾部 所以將棧里元素依次出棧 加入后綴表達(dá)式
此時(shí)棧為 后綴表達(dá)式 9 3 1 - 3 * + 10 2 / +

得到最終后綴表達(dá)式 9 3 1 - 3 * + 10 2 / +

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祸憋,一起剝皮案震驚了整個(gè)濱河市会宪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚯窥,老刑警劉巖掸鹅,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拦赠,居然都是意外死亡巍沙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門荷鼠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來句携,“玉大人,你說我怎么就攤上這事允乐“担” “怎么了削咆?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蠢笋。 經(jīng)常有香客問我拨齐,道長,這世上最難降的妖魔是什么昨寞? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任瞻惋,我火速辦了婚禮,結(jié)果婚禮上援岩,老公的妹妹穿的比我還像新娘歼狼。我一直安慰自己,他們只是感情好享怀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布羽峰。 她就那樣靜靜地躺著,像睡著了一般凹蜈。 火紅的嫁衣襯著肌膚如雪限寞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天仰坦,我揣著相機(jī)與錄音履植,去河邊找鬼。 笑死悄晃,一個(gè)胖子當(dāng)著我的面吹牛玫霎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妈橄,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼庶近,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了眷蚓?” 一聲冷哼從身側(cè)響起鼻种,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沙热,沒想到半個(gè)月后叉钥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篙贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年投队,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爵川。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敷鸦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扒披,我是刑警寧澤值依,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站碟案,受9級(jí)特大地震影響鳞滨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蟆淀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澡匪。 院中可真熱鬧熔任,春花似錦、人聲如沸唁情。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甸鸟。三九已至惦费,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抢韭,已是汗流浹背薪贫。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刻恭,地道東北人瞧省。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鳍贾,于是被迫代替她去往敵國和親鞍匾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容