999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

論中綴表達式與后綴表達式的轉換

2008-01-01 00:00:00朱玉娟
現代商貿工業 2008年6期

摘 要:為了處理方便,編譯程序常把中綴表達式首先轉換成等價的后綴表達式。介紹如何使用順序棧這樣一種數據結構實現中綴表達式向后綴表達式的轉換。

關鍵詞:堆棧;中綴表達式;后綴表達式

中圖分類號:G40文獻標識碼:A文章編號:1672-3198(2008)06-0258-02

1 中綴表達式求值

首先我們來看一下什么叫作中綴表達式?所謂中綴表達式是指:每個二目運算符在兩個運算量的中間。例如:a+b。

這里假設所討論的算術運算符包括:+ 、-、*、/和括號()。根據算術四則運算的規則:先乘除后加減、先括號內再括號外、同級別時先左后右,可以得出運算符的優先級為:()→*、/ →+、-。如:a+b×c-(d+e)。我們根據優先級,計算出d+e的值x,再計算出b×c的值y,然后從左到右計算a+x-y。

它的的求值過程為:自左向右掃描表達式,當掃描到a+b時不能馬上計算,因為后面可能還有更高的運算。我們可以用兩個棧來處理這樣的問題:對象棧s1和算符棧s2。當自左至右掃描表達式的每一個字符時,若當前字符是運算對象,入對象棧,是運算符時,若這個運算符比棧頂運算符高則入棧,繼續向后處理,若這個運算符比棧頂運算符低則從對象棧出棧兩個運算量,從算符棧出棧一個運算符進行運算,并將其運算結果入對象棧,繼續處理當前字符,直到遇到結束符。

2 后綴表達式求值

所謂后綴表達式,是指運算符在運算對象之后。在后綴表達式中,不再引入括號,所有的計算按運算符出現的順序,嚴格從左向右進行,而不用再考慮運算規則和級別。例如:abcd/-e*+。從左向右,首先計算/,即c/d的值x,然后計算b-x的值y,再計算y*e的值z,最后計算a+z。

計算一個后綴表達式,算法上比計算一個中綴表達式簡單的多。這是因為表達式中即無括號又無優先級的約束。具體做法:只使用一個對象棧,當從左向右掃描表達式時,每遇到一個操作數就送入棧中保存,每遇到一個運算符就從棧中取出兩個操作數進行當前的計算,然后把結果再入棧,直到整個表達式結束,這時送入棧頂的值就是結果。

3 中綴表達式轉換成后綴表達式

為了處理方便,編譯程序常把中綴表達式首先轉換成等價的后綴表達式。

例如:一個中綴表達式:a+(b-c/d)*e

其相應的后綴表達式為:abcd/-e*+

我們可以用棧這樣一種數據結構實現中綴表達式向后綴表達式的轉換,具體步驟如下:

(1)設置一個堆棧,將棧頂預設置為‘#’;

(2)順序讀入中綴表達式。當讀到的單詞為操作數時將其輸出,并接著讀入下一個單詞;當讀入的單詞為運算符時就賦給x2,比較x2與棧頂運算符x1的優先級:

①若x2的優先級高于x1,將x2進棧,繼續讀入下一個單詞;

②若x2的優先級低于x1,x1退棧并作為后綴表達式的一個單詞輸出,然后比較x2與新的棧頂運算符x1;

③若x2的優先級等于x1,且x1為'(',x2為')',則x1出棧,然后繼續讀下一個單詞;

④若x2的優先級等于x1的,且x1為'#',x2也為'#',則算法結束。

假設中綴表達式存在字符串expression中,且堆棧采用順序棧,進出棧算法分別為PushQstuck()和PopQstuck(),則中綴表達式變后綴表達式的算法為:

int postfix(qstype *s,char *expression) /*中綴表達式變后綴表達式*/

{

char x1,x2,x;

int j=0;

s->stack[0]='#';

s->top=0;

x2=expression[j];

if((x1=gettopqstack(s))==nil) /* gettopqstack()函數取棧頂元素*/

exit(0);

while(1)

{

if(x2!='+'x2!='-'x2!='*'x2!='/'x2!='('x2!=')'x2!='#')

{

cout<

x2=expression[++j];

}

else if(proceed(x1,x2)=='<')/* proceed()函數比較字符x1和x2的優先級*/

{

if(!pushqstack(s,x2))

exit(0);

if((x1=gettopqstack(s))==nil)

exit(0);

x2=expression[++j];

}

else if(proceed(x1,x2)=='>')

{

if((x=popqstack(s))==nil)

exit(0);

cout<

if((x1=gettopqstack(s))==nil)

exit(0);

}

else if(proceed(x1,x2)=='='x1=='('x2==')')

{

if(popqstack(s)==nil)

exit(0);

if((x1=gettopqstack(s))==nil)

exit(0);

x2=expression[++j];

}

else if(proceed(x1,x2)=='='x1=='#'x2=='#')return 1;

else if(proceed(x1,x2)==' ') break;

}

cout<<\"error\";

return 0;

}

若表達式expression為a+(b-c/d)*e則我們通過下表可以看出轉換的過程:

4 總結

為了處理方便,編譯程序常把中綴表達式首先轉換成等價的后綴表達式。棧是限制僅在表的一端進行插入和刪除運算的線性表,通常稱插入、刪除的這一端為棧頂(Top),另一端稱為棧底(Bottom)。棧的修改是按后進先出的原則進行的。利用棧的這一特點,我們利用順序棧這樣一種數據結構來實現中綴表達式轉換成后綴表達式是完全可行的。

參考文獻

[1] 嚴蔚敏.數據結構[M].北京:清華大學出版社.

[2]蔣文蓉.數據結構[M].北京:高等教育出版社.

注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。”

主站蜘蛛池模板: 精品福利一区二区免费视频| 亚洲欧美激情另类| 三级欧美在线| 国产丝袜第一页| 91视频99| 国产内射一区亚洲| 91精品啪在线观看国产91九色| 欧美日韩成人在线观看| 国产一级无码不卡视频| 就去吻亚洲精品国产欧美| 午夜视频在线观看免费网站| 午夜不卡视频| 亚洲av无码人妻| Jizz国产色系免费| 2018日日摸夜夜添狠狠躁| 丰满人妻中出白浆| 91精品人妻一区二区| 久久性妇女精品免费| 美女高潮全身流白浆福利区| 女人av社区男人的天堂| 国产精品免费电影| 福利视频久久| 成人欧美在线观看| 国产一区在线视频观看| 亚洲成在线观看| 日韩欧美91| 亚洲欧美日韩中文字幕一区二区三区 | 成人免费网站久久久| 97国产在线观看| 亚洲不卡影院| 国产精品漂亮美女在线观看| 欧美性色综合网| 国产亚洲视频免费播放| 在线日本国产成人免费的| 久久99久久无码毛片一区二区| 视频二区中文无码| 日韩天堂视频| 狠狠五月天中文字幕| 亚洲欧美不卡| 亚洲an第二区国产精品| 欧美精品v欧洲精品| 青青网在线国产| 四虎永久免费在线| 国产精品网址在线观看你懂的| 欧美国产精品不卡在线观看| 色婷婷成人| 日本人又色又爽的视频| 免费无码网站| 久久久久亚洲精品成人网 | 国产凹凸视频在线观看| 香蕉综合在线视频91| 国产午夜在线观看视频| 久久精品无码一区二区国产区| 国产一区在线视频观看| 亚洲无码高清免费视频亚洲| 91精品国产自产在线老师啪l| 国产成人做受免费视频| 国产呦精品一区二区三区网站| 又猛又黄又爽无遮挡的视频网站| 国产美女91呻吟求| 一级爆乳无码av| 中文字幕无码中文字幕有码在线| 欧美不卡视频一区发布| 欧美日韩国产成人在线观看| 国产美女无遮挡免费视频| 亚洲无码日韩一区| 伊人蕉久影院| 亚洲无码久久久久| 亚洲天堂啪啪| 在线观看av永久| 亚洲精品午夜天堂网页| 99视频在线看| 亚洲午夜福利在线| 国产一区二区人大臿蕉香蕉| 99无码熟妇丰满人妻啪啪| 欧美激情一区二区三区成人| 日韩精品久久久久久久电影蜜臀| 亚洲精品无码AV电影在线播放| 日韩毛片免费视频| 欲色天天综合网| 中国国产A一级毛片| 欧美在线伊人|