版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式我們?cè)跀?shù)學(xué)中常見的計(jì)算式,例如2+(3*4)叫做中綴表達(dá)式。表達(dá)式中涉及到了多個(gè)運(yùn)算符,而運(yùn)算符之間是有優(yōu)先級(jí)的。計(jì)算機(jī)在計(jì)算并且處理這種表達(dá)式時(shí),需要將中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,然后再進(jìn)行計(jì)算。中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式遵循以下原則:1.遇到操作數(shù),直接輸出;2.棧為空時(shí),遇到運(yùn)算符,入棧;3.遇到左括號(hào),將其入棧;4.遇到右括號(hào),執(zhí)行出棧操作,并將出棧的元素輸出,直到彈出棧的是左括號(hào),左括號(hào)不輸出;5.遇到其他運(yùn)算符'+''-''*''/'時(shí),彈出所有優(yōu)先級(jí)大于或等于該運(yùn)算符的棧頂元素,然后將該運(yùn)算符入棧;6.最終將棧中的元素依次出棧,輸出。經(jīng)過上面的步驟,得到的輸出既是轉(zhuǎn)換得到的后綴表達(dá)式。舉例:a+b*c+(d*e+f)*g--------->abc*+de*f+g*+遇到a,直接輸出:遇到+,此時(shí)棧為空,入棧:數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第1頁。遇到b,直接輸出:數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第1頁。遇到*,優(yōu)先級(jí)大于棧頂符號(hào)優(yōu)先級(jí),入棧:遇到c,輸出:遇到+,目前站內(nèi)的*與+優(yōu)先級(jí)都大于或等于它,因此將棧內(nèi)的*,+依次彈出并且輸出,并且將遇到的這個(gè)+入棧:數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第2頁。數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第2頁。遇到d,直接輸出:遇到*,由于*的優(yōu)先級(jí)高于處在棧中的(,因此*入棧:遇到e,直接輸出:數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第3頁。數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第3頁。遇到f,直接輸出:遇到),彈出棧頂元素并且輸出,直到彈出(才結(jié)束,在這里也就是彈出+輸出,彈出(不輸出:遇到*,優(yōu)先級(jí)高于棧頂+,將*入棧:數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第4頁。數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第4頁。此時(shí)已經(jīng)沒有新的字符了,依次出棧并輸出操作直到棧為空:明白了這個(gè)過程,現(xiàn)在就需要用代碼實(shí)現(xiàn)了。對(duì)于各種運(yùn)算符的優(yōu)先級(jí),可以使用整數(shù)來表示運(yùn)算符的級(jí)別??梢远x一個(gè)函數(shù)來返回各種符號(hào)的優(yōu)先級(jí)數(shù)字:/******************************************************************根據(jù)字符該字符是否在棧中,返回該字符的優(yōu)先級(jí)。*這里只處理+、-、*、/、(、)這些符號(hào)。*需要注意的是:如果(在棧中,它的優(yōu)先級(jí)是最低的,不在棧中則是最高的*@paramc:需要判斷的字符*@paramflag:字符是否在棧中,0表示在棧中,1表示不在棧中*****************************************************************/intGetPrecedence(charc,intflag){ if(c=='+'||c=='-') { return1; } elseif(c=='*'||c=='/') { return2; } elseif(c=='('&&flag==0) {數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第5頁。數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第5頁。 } elseif(c=='('&&flag==1) { return3; } else { fprintf(stderr,"Inputcharisinvalid!\n"); return-1; }}/*****************************************************************判斷一個(gè)字符是不是運(yùn)算符*如果是合法的運(yùn)算符+、-、*、/、(、)則返回0,否則返回1****************************************************************/intIsOperator(charc){ if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') { return0; } else { return1; }}/*****************************************************************完整的代碼如下:****************************************************************/#include<stdio.h>#include<stdlib.h>#defineElementTypechartypedefstructNode*PtrToNode;typedefPtrToNodeStack;typedefstructNode{ ElementTypeElement; PtrToNodeNext;數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第6頁。數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第6頁。intIsEmpty(StackS);StackCreateStack();voidDisposeStack(StackS);voidMakeEmpty(StackS);voidPush(ElementTypeX,StackS);ElementTypeTop(StackS);voidPop(StackS);//判斷棧是否為空intIsEmpty(StackS){ returnS->Next==NULL;}//創(chuàng)建鏈棧StackCreateStack(){ StackS=malloc(sizeof(structNode)); if(S==NULL) { printf("Noenoughmemory!"); returnNULL; } S->Next=NULL; MakeEmpty(S); returnS;}//清空棧voidMakeEmpty(StackS){ if(S==NULL) { printf("UseCreateStackFirst!"); } else { while(!IsEmpty(S)) { Pop(S); } }}//進(jìn)棧數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第7頁。voidP數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第7頁。{ PtrToNodeTmp; Tmp=malloc(sizeof(structNode)); if(Tmp!=NULL) { Tmp->Element=X; Tmp->Next=S->Next; S->Next=Tmp; } else { printf("Outofspace!"); }}//出棧voidPop(StackS){ if(IsEmpty(S)) { printf("TheStackisEmpty!"); } else { PtrToNodeTmp=S->Next; S->Next=Tmp->Next; free(Tmp); }}//返回棧頂元素ElementTypeTop(StackS){ if(IsEmpty(S)) { printf("Thestackisempty!"); return0; } else { returnS->Next->Element; }}數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第8頁。/**數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第8頁。*根據(jù)字符該字符是否在棧中,返回該字符的優(yōu)先級(jí)。*這里只處理+、-、*、/、(、)這些符號(hào)。*需要注意的是:如果(在棧中,它的優(yōu)先級(jí)是最低的,不在棧中則是最高的*@paramc:需要判斷的字符*@paramflag:字符是否在棧中,0表示在棧中,1表示不在棧中*****************************************************************/intGetPrecedence(charc,intflag){ if(c=='+'||c=='-') { return1; } elseif(c=='*'||c=='/') { return2; } elseif(c=='('&&flag==0) { return0; } elseif(c=='('&&flag==1) { return3; } else { fprintf(stderr,"Inputcharisinvalid!\n"); return-1; }}/*****************************************************************判斷一個(gè)字符是不是運(yùn)算符*如果是合法的運(yùn)算符+、-、*、/、(、)則返回0,否則返回1****************************************************************/intIsOperator(charc){ if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') { return0; } else {數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第9頁。數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第9頁。 }}charOutput[50];//中綴表達(dá)式轉(zhuǎn)成后綴表達(dá)式char*InfixToPostfix(char*ch,StackS){ intindex=0; charc; while((c=*ch)!='\0') { //不是運(yùn)算符,將該字符放進(jìn)輸出字符數(shù)組中。 if(IsOperator(c)==1) { Output[index++]=c; ch++; } //是運(yùn)算符 else { //如果此時(shí)棧為空,運(yùn)算符進(jìn)棧 if(IsEmpty(S)) { Push(c,S); ch++; continue; } else { if(c==')') { while(!IsEmpty(S)&&Top(S)!='(') { Output[index++]=Top(S); Pop(S); } Pop(S); ch++; continue; } else {數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第10頁。 intoutPrecedence=GetPrecedence(c,1);數(shù)據(jù)結(jié)構(gòu)之中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式全文共11頁,當(dāng)前為第10頁。 while(!IsEmpty(S)&&GetPrecedence(Top(S),0)>=outPrecedence) { Output[index++]=Top(S); Pop(S); } Push(c,S); ch++; continue; } } } } while(!IsEmpty(S)) { Output[index++]=Top(S); Pop(S); } Output[index]='\0'; returnOutput;}intmain(void){ Stac
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租車租賃服務(wù)證明合同
- 文化用品廠勞動(dòng)合同模板
- 醫(yī)療信息系統(tǒng)處理機(jī)房租賃合同
- 農(nóng)業(yè)工程分包合同
- 熱氣球用電施工合同
- 云云云辦公服務(wù)期合同
- 通信基站建設(shè)免責(zé)合同
- 建筑防水施工合同
- 滑雪季節(jié)車輛租賃合同范本
- 旅游景區(qū)租賃合同模板與房屋
- 2024年統(tǒng)編版小學(xué)六年級(jí)《道德與法治》上冊(cè)第四單元 法律保護(hù)我們健康成長(zhǎng) 9.《知法守法 依法維權(quán)》 第一課時(shí) 課件
- 期中測(cè)試卷-2024-2025學(xué)年語文六年級(jí)上冊(cè)統(tǒng)編版
- 學(xué)校消防系統(tǒng)維保及檢測(cè)總體服務(wù)方案
- 網(wǎng)絡(luò)安全試題題庫及參考答案
- 終極戰(zhàn)略規(guī)劃指南:深度剖析Cross SWOT分析、市場(chǎng)洞察與內(nèi)部能力優(yōu)化的綜合行動(dòng)方案
- 《白描花卉妙筆生》 課件 2024-2025學(xué)年嶺南美版(2024) 初中美術(shù)七年級(jí)上冊(cè)
- 園區(qū)出入管理系統(tǒng)施工方案
- 數(shù)據(jù)可視化說課 高中信息技術(shù)
- 混凝土結(jié)構(gòu)施工圖平面整體表示方法制圖規(guī)則和詳圖
- 2024年二季度靈活就業(yè)調(diào)查報(bào)告
- 中華民族現(xiàn)代文明有哪些鮮明特質(zhì)?建設(shè)中華民族現(xiàn)代文明的路徑是什么?參考答案三
評(píng)論
0/150
提交評(píng)論