




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上我們?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)換得到的
2、后綴表達(dá)式。舉例:a+b*c+(d*e+f)*g - abc*+de*f+g*+遇到a,直接輸出:遇到+,此時(shí)棧為空,入棧:遇到b,直接輸出:遇到*,優(yōu)先級(jí)大于棧頂符號(hào)優(yōu)先級(jí),入棧:遇到c,輸出:遇到+,目前站內(nèi)的*與+優(yōu)先級(jí)都大于或等于它,因此將棧內(nèi)的*,+依次彈出并且輸出,并且將遇到的這個(gè)+入棧:遇到(,將其入棧:遇到d,直接輸出:遇到*,由于*的優(yōu)先級(jí)高于處在棧中的(,因此*入棧:遇到e,直接輸出:遇到+,棧頂?shù)?優(yōu)先級(jí)高于+,但是棧內(nèi)的(低于+,將*出棧輸出,+入棧:遇到f,直接輸出:遇到),彈出棧頂元素并且輸出,直到彈出(才結(jié)束,在這里也就是彈出+輸出,彈出(不輸出:遇到*,優(yōu)先級(jí)高
3、于棧頂+,將*入棧:遇到g,直接輸出:此時(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í)是最低的,不在棧中則是最高的*param c:需要判斷的字符*param flag:字符是否在棧中,0表示在棧中,1表示不在棧中*/int GetPrecedence(char c,int flag)if(c=+ | c=-)retu
4、rn 1;else if(c=* | c=/)return 2;else if(c=( & flag=0)return 0;else if(c=( & flag=1)return 3;elsefprintf(stderr,Input char is invalid!n);return -1;/*判斷一個(gè)字符是不是運(yùn)算符*如果是合法的運(yùn)算符+、-、*、/、(、)則返回0,否則返回1*/int IsOperator(char c)if(c=+|c=-|c=*|c=/|c=(|c=)return 0;elsereturn 1;/*完整的代碼如下:*/#include #include #define
5、 ElementType chartypedef struct Node *PtrToNode;typedef PtrToNode Stack;typedef struct NodeElementType Element;PtrToNode Next;int IsEmpty(Stack S);Stack CreateStack();void DisposeStack(Stack S);void MakeEmpty(Stack S);void Push(ElementType X,Stack S);ElementType Top(Stack S);void Pop(Stack S);/判斷棧是否
6、為空int IsEmpty(Stack S)return S-Next = NULL;/創(chuàng)建鏈棧Stack CreateStack()Stack S = malloc(sizeof(struct Node);if(S = NULL)printf(No enough memory!);return NULL;S-Next = NULL;MakeEmpty(S);return S;/清空棧void MakeEmpty(Stack S)if(S = NULL)printf(Use CreateStack First!);elsewhile(!IsEmpty(S)Pop(S);/進(jìn)棧void Push
7、(ElementType X,Stack S)PtrToNode Tmp;Tmp = malloc(sizeof(struct Node);if(Tmp != NULL)Tmp-Element = X;Tmp-Next = S-Next;S-Next = Tmp;elseprintf(Out of space!);/出棧void Pop(Stack S)if(IsEmpty(S)printf(The Stack is Empty!);elsePtrToNode Tmp = S-Next;S-Next = Tmp-Next;free(Tmp);/返回棧頂元素ElementType Top(Sta
8、ck S)if(IsEmpty(S)printf(The stack is empty!);return 0;elsereturn S-Next-Element;/*根據(jù)字符該字符是否在棧中,返回該字符的優(yōu)先級(jí)。*這里只處理+、-、*、/、(、)這些符號(hào)。*需要注意的是:如果(在棧中,它的優(yōu)先級(jí)是最低的,不在棧中則是最高的*param c:需要判斷的字符*param flag:字符是否在棧中,0表示在棧中,1表示不在棧中*/int GetPrecedence(char c,int flag)if(c=+ | c=-)return 1;else if(c=* | c=/)return 2;els
9、e if(c=( & flag=0)return 0;else if(c=( & flag=1)return 3;elsefprintf(stderr,Input char is invalid!n);return -1;/*判斷一個(gè)字符是不是運(yùn)算符*如果是合法的運(yùn)算符+、-、*、/、(、)則返回0,否則返回1*/int IsOperator(char c)if(c=+|c=-|c=*|c=/|c=(|c=)return 0;elsereturn 1;char Output50;/中綴表達(dá)式轉(zhuǎn)成后綴表達(dá)式char* InfixToPostfix(char *ch,Stack S)int ind
10、ex=0;char c;while(c=*ch) != 0)/不是運(yùn)算符,將該字符放進(jìn)輸出字符數(shù)組中。if(IsOperator(c)=1)Outputindex+ = c;ch+;/是運(yùn)算符else/如果此時(shí)棧為空,運(yùn)算符進(jìn)棧if(IsEmpty(S)Push(c,S);ch+;continue;elseif(c=)while(!IsEmpty(S) & Top(S) != ()Outputindex+ = Top(S);Pop(S);Pop(S);ch+;continue;elseint outPrecedence = GetPrecedence(c,1);while(!IsEmpty(S) & GetPrecedence(Top(S),0) = outPrecedence)Outputindex+ = Top(S);Pop(S);Push(c,S);ch+;continue;while(!IsEmpty(S)Outputindex+ = Top(S);Pop(S);Outputindex = 0;return Output;int main(void)Stack S = Cr
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 以少先隊(duì)活動(dòng)為翼鑄小學(xué)低年級(jí)學(xué)生耐挫之魂
- 水利水電工程安全技術(shù)交底記錄大全范文
- 醫(yī)療設(shè)備招投標(biāo)部職責(zé)指南
- 學(xué)校安全隱患報(bào)告組織機(jī)構(gòu)及職責(zé)
- 高三年級(jí)模擬考試計(jì)劃
- 河南省周口市扶溝縣大新鎮(zhèn)2025屆高一下化學(xué)期末聯(lián)考模擬試題含解析
- 云南省昆明一中2025年高二下化學(xué)期末考試模擬試題含解析
- 中國(guó)高鐵產(chǎn)業(yè)園區(qū)行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略規(guī)劃報(bào)告
- 婁底市重點(diǎn)中學(xué)2025屆高二化學(xué)第二學(xué)期期末達(dá)標(biāo)檢測(cè)模擬試題含解析
- 中國(guó)折漿式攪拌機(jī)行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告(2024-2030)
- 環(huán)境水利學(xué)-001-國(guó)開機(jī)考復(fù)習(xí)資料
- 施工現(xiàn)場(chǎng)實(shí)施信息化監(jiān)控和數(shù)據(jù)處理方案
- 【培訓(xùn)課件】卓越講師技能訓(xùn)練
- 4 我們的公共生活 第2課時(shí)維護(hù)公共利益 說課稿-2023-2024學(xué)年道德與法治五年級(jí)下冊(cè)統(tǒng)編版
- 2024年個(gè)人聯(lián)營(yíng)經(jīng)營(yíng)承包合同樣本
- 新辦公樓會(huì)議室音視頻系統(tǒng)施工方案
- 電子商務(wù)平臺(tái)客戶服務(wù)標(biāo)準(zhǔn)規(guī)范
- 2025屆浙江省樂清市知臨中學(xué)高一數(shù)學(xué)第一學(xué)期期末檢測(cè)試題含解析
- 附件3:公司境外突發(fā)事件應(yīng)急預(yù)案
- 北京市西城區(qū)北京市第四中學(xué)2024-2025學(xué)年七年級(jí)上學(xué)期分班考數(shù)學(xué)試卷
- 京東自營(yíng)母嬰采購(gòu)合同協(xié)議書
評(píng)論
0/150
提交評(píng)論