版權(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í)別。可以定義一個(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版內(nèi)外墻面施工項(xiàng)目變更管理合同4篇
- 二零二五年度環(huán)境治理工程承包合同模板4篇
- 2025年獼猴桃采摘體驗(yàn)園項(xiàng)目土地租賃與經(jīng)營管理合同4篇
- 2025年度二零二五年度民辦學(xué)校教師教育教學(xué)資源共享合同3篇
- 二零二五年度農(nóng)業(yè)保險(xiǎn)代理服務(wù)承包協(xié)議4篇
- 二零二五年度智慧城市車牌租賃與交通流量預(yù)測(cè)合同4篇
- 二零二五年度原創(chuàng)劇本創(chuàng)作合同解除及版權(quán)歸屬協(xié)議3篇
- 二零二五年度船舶租賃與船舶租賃保險(xiǎn)合同8篇
- 2025年度綠色有機(jī)農(nóng)資直銷合作合同2篇
- 二零二五年度船運(yùn)水泥運(yùn)輸合同爭(zhēng)議解決機(jī)制范本2篇
- 國家中醫(yī)藥管理局發(fā)布的406種中醫(yī)優(yōu)勢(shì)病種診療方案和臨床路徑目錄
- 2024年全國甲卷高考化學(xué)試卷(真題+答案)
- 汽車修理廠管理方案
- 人教版小學(xué)數(shù)學(xué)一年級(jí)上冊(cè)小學(xué)生口算天天練
- 三年級(jí)數(shù)學(xué)添括號(hào)去括號(hào)加減簡(jiǎn)便計(jì)算練習(xí)400道及答案
- 蘇教版五年級(jí)上冊(cè)數(shù)學(xué)簡(jiǎn)便計(jì)算300題及答案
- 澳洲牛肉行業(yè)分析
- 老客戶的開發(fā)與技巧課件
- 計(jì)算機(jī)江蘇對(duì)口單招文化綜合理論試卷
- 成人學(xué)士學(xué)位英語單詞(史上全面)
- KAPPA-實(shí)施方法課件
評(píng)論
0/150
提交評(píng)論