棧的應(yīng)用——表達(dá)式求值算法

表達(dá)式求值算法

算符優(yōu)先法:

根據(jù)這個(gè)運(yùn)算優(yōu)先關(guān)系的規(guī)定來實(shí)現(xiàn)對(duì)表達(dá)式的編譯或解釋執(zhí)行的倒得。

算數(shù)四則運(yùn)算規(guī)則:

  1. 先乘除泻红,后加減;,

  2. 從左算到右屎暇;

  3. 先括號(hào)內(nèi)承桥,后括號(hào)外;

任何一個(gè)表達(dá)式都是由操作數(shù)根悼、運(yùn)算符和界限符組成的凶异,稱之為單詞。其中運(yùn)算符和界限符統(tǒng)稱為算符

算符間的優(yōu)先關(guān)系

+ - * / ( ) #
+ > > < < < > >
- > > < < < > >
* > > > > < > >
/ > > > > < > >
( < < < < < =
) > > > > > >
# < < < < < =

為了實(shí)現(xiàn)算符優(yōu)先算法挤巡,可以使用兩個(gè)工作棧剩彬。一個(gè)稱為OPTR,用以寄存運(yùn)算符矿卑;另外一個(gè)稱做OPND喉恋,用以寄存操作數(shù)或運(yùn)算結(jié)果;

算法的基本思想如下:

  • 首先置操作數(shù)棧為空棧母廷,表達(dá)式起始符“#”為運(yùn)算符棧的棧底元素轻黑;

  • 依次讀入表達(dá)式中的每一個(gè)字符,若是操作數(shù)則進(jìn)入OPND棧琴昆,若是運(yùn)算符和OPTR棧的棧頂運(yùn)算符比較優(yōu)先權(quán)后作相應(yīng)操作氓鄙,直至整個(gè)表達(dá)式求值完畢。(即OPTR棧的棧頂元素和當(dāng)前讀入的字符均為“#”)业舍。

求值過程:

OperandType EvaluateExpression(){
    //算數(shù)表達(dá)式求值的算符優(yōu)先算法抖拦。
    //設(shè)OPTR和OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧。
    //OP為運(yùn)算符集合
    InitStack (OPTR);
    Push(OPTR,'#');
    InitStack(OPND);
    c=getchar();
    while(c!='#' || GetTop(OPTR)!='#'){
        if(!In(c,OP)){
            Push(OPND,c);
            c=getchar();
        }else{
            switch(Precede(GetTop(OPTR),c)){
                case '<'://棧頂元素優(yōu)先權(quán)低
                    Push(OPTR,c);
                    c=getchar();
                    break;
                case '='://脫括號(hào)并接收下一字符
                    Pop(OPTR,x);
                    c=getchar();
                    break;
                case '>'://退棧并將運(yùn)算結(jié)果入棧
                    Pop(OPTR,theta);
                    Pop(OPND,b);
                    Pop(OPND,a);
                    Push(OPND,Operate(a,ttheta,b));
                    break;
            }//switch
        }
    }//while
    return GetTop(OPND);
}//EvaluateExpression

其中舷暮,Precede函數(shù)是判定運(yùn)算符棧的棧頂運(yùn)算符與讀入的運(yùn)算符之間優(yōu)先關(guān)系的函數(shù)态罪;

Operate是進(jìn)行二元運(yùn)算的函數(shù),如果是編譯表達(dá)式下面,則產(chǎn)生這個(gè)運(yùn)算的一組相應(yīng)指令并返回存放結(jié)果的中間變量复颈;如果是解釋執(zhí)行表達(dá)式,則直接進(jìn)行該運(yùn)算诸狭,并返回運(yùn)算結(jié)果券膀。


E5E6DC97A7925BE8033BC28BCE74A26D.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末君纫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芹彬,更是在濱河造成了極大的恐慌蓄髓,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舒帮,死亡現(xiàn)場(chǎng)離奇詭異会喝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)玩郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肢执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人译红,你說我怎么就攤上這事预茄。” “怎么了侦厚?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵耻陕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我刨沦,道長(zhǎng)诗宣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任想诅,我火速辦了婚禮召庞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘来破。我一直安慰自己篮灼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布徘禁。 她就那樣靜靜地躺著穿稳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晌坤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天旦袋,我揣著相機(jī)與錄音骤菠,去河邊找鬼。 笑死疤孕,一個(gè)胖子當(dāng)著我的面吹牛商乎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祭阀,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鹉戚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鲜戒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抹凳,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤遏餐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赢底,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體失都,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年幸冻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粹庞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洽损,死狀恐怖庞溜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碑定,我是刑警寧澤流码,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站不傅,受9級(jí)特大地震影響旅掂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜访娶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一商虐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崖疤,春花似錦秘车、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至权烧,卻和暖如春眯亦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背般码。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工妻率, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人板祝。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓宫静,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孤里,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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