版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 /ExpressionSeqStack.c#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#define ERR_NOMEMORY -1 /內(nèi)存分配錯誤#define ERR_INVALIDPARAM -2 /輸入?yún)?shù)無效#define ERR_OVERFLOW -3 /溢出#define ERR_ILLEGALINDEX -4 /非法的索引位置#define ERR_EMPTYRESULT -5 /無返回結(jié)果#define STACK_MAXSIZE
2、 100 /順序棧存放的最大元素個數(shù)typedef int datatype; /順序棧元素的類型 typedef struct /順序棧結(jié)構(gòu)類型datatype* base;datatype* top;int size;SeqStack;/*初始化順序棧*/int InitStack(SeqStack *stack)if(!stack)return ERR_INVALIDPARAM; /順序棧無效/分配內(nèi)存空間stack->base=(datatype*)malloc(STACK_MAXSIZE*sizeof(datatype);if(!stack->base)return ER
3、R_NOMEMORY; /內(nèi)存分配失敗 stack->top=stack->base; /初始棧頂位置 stack->size=STACK_MAXSIZE; /順序棧的大小為STACK_MAXSIZE return 0;/*棧是否為空*/int StackEmpty(SeqStack *stack)if(!stack)return ERR_INVALIDPARAM; /順序棧無效 return(stack->top=stack->base); /True為空;False為非空/*清空棧*/int ClearStack(SeqStack *stack)if(!sta
4、ck)return ERR_INVALIDPARAM; /順序棧無效stack->top=stack->base; /重置棧頂位置return 0;/*取得棧頂元素*/int GetTop(SeqStack *stack,datatype *e) if(!stack)return ERR_INVALIDPARAM; /順序棧無效 if(stack->top=stack->base)return ERR_EMPTYRESULT;/棧為空 *e=*(stack->top-1); /返回棧頂元素 return 0;/*將元素入棧*/int Push(SeqStack*s
5、tack,datatype e)if(!stack)return ERR_INVALIDPARAM; /順序棧無效if(stack->top>stack->base+stack->size-1)return ERR_OVERFLOW; /(1)棧滿*(stack->top)=e; /(2)將元素e賦予新的棧頂位置stack->top+; /(3)棧頂指針增1return 0;/*將元素出棧*/int Pop(SeqStack *stack,datatype *e)if(!stack)return ERR_INVALIDPARAM; /順序棧無效if(stac
6、k->top=stack->base)return ERR_EMPTYRESULT; /(1)棧為空stack->top-; /(2)棧頂指針減1*e=*(stack->top); /(3)返回棧頂元素return 0;/*比較兩運(yùn)算符的優(yōu)先關(guān)系*/int ComparePriority(char op1,char op2)int priority1=0,priority2=0;if(op1='+'|op1='-')priority1=1; /運(yùn)算符1的優(yōu)先級else if(op1='*'|op1='/')
7、priority1=2;if(op2='+'|op2='-')priority2=1; /運(yùn)算符2的優(yōu)先級else if(op2='*'|op2='/')priority2=2;return(priority1-priority2); /op1>op2,op1=op2,op1<op2/*中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式*/int InfixToSuffix(char *infix,char *suffix)char c;int t=0;char *pInfix=infix; /中綴表達(dá)式char *pSuffix=suffi
8、x; /后綴表達(dá)式/初始化順序棧SeqStack optr;InitStack(&optr);/依次掃描中綴表達(dá)式while(*pInfix!='0')c=*pInfix; /(1)讀取中綴表達(dá)式的每個字符if(c>='0'&&c<='9') /(2)該字符為操作數(shù)*pSuffix=c; /直接添加到后綴表達(dá)式中pSuffix+; /指向保存下一個字符的位置else if(c='(') /(3)當(dāng)前字符為左括號"("Push(&optr,c); /直接將其添加到棧中e
9、lse if(c=')') /(4)當(dāng)前字符為右括號")"Peek(&optr,&t); /取得括號內(nèi)的運(yùn)算符while(t!='(')*pSuffix=t; /將括號內(nèi)的所有操作數(shù)和運(yùn) pSuffix+; /算符添加到后綴表達(dá)式中Pop(&optr,&t); /移除已添加的運(yùn)算符Peek(&optr,&t); /查找下一個運(yùn)算符Pop(&optr,&t); /將左括號移除else if(StackEmpty(&optr) /(5)運(yùn)算符為空時直接將其入棧Push(&am
10、p;optr,&t);else /將棧中的所有運(yùn)算符添加到后綴表達(dá)式中Peek(&optr,&t); /取棧頂運(yùn)算符,當(dāng)前運(yùn)算符的優(yōu)先級高于if(ComparePriority(c,t)>0) /棧頂運(yùn)算符的優(yōu)先級將直接入棧Push(&optr,&t);else /否則,將棧中所有優(yōu)先級高于當(dāng)前優(yōu)先級 /的運(yùn)算符添加到后綴表達(dá)式中while(!StackEmpty(&optr)&&ComparePriority(c,t)<=0)*pSuffix=t;pSuffix+;Pop(&optr,&t); /移除
11、已添加到后綴表達(dá)式中的運(yùn)算符Peek(&optr,&t); /查找下一個運(yùn)算符Push(&optr,c); /將當(dāng)前運(yùn)算符添加到棧中/掃描中綴表達(dá)式的下一個字符pSuffix+;/(6)將剩余的運(yùn)算符添加到后綴表達(dá)式中while(!StackEmpty(&optr)Pop(&optr,&t);*pSuffix=t;pSuffix+;/釋放順序棧的內(nèi)存free(optr.base);return0;/*計(jì)算兩個操作數(shù)的值*/int Operate(int a,char op,int b)Switch(op)case'+':retur
12、na+b; /加法運(yùn)算case'-':returna-b; /減法運(yùn)算case'*':returna*b; /乘法運(yùn)算case'/':returna/(b=0?1:b); /除法運(yùn)算return 0;/*計(jì)算后綴表達(dá)式的值*/int CalculateExpressionBySuffix(char *suffix)char c;int a=0,b=0,s=0;const char *pSuffix=suffix; /后綴表達(dá)式/初始化程序棧SeqStack opnd;InitStack(&opnd);/從左到右依掃描后綴表達(dá)式while(
13、*pSuffix !='0') c=*pSuffix; /讀取后綴表達(dá)式的每個字符if(c>='0'&&c<='9') /該字符為操作數(shù)Push(&opnd,c-48); /直接將其添加到棧中else /該字符為運(yùn)算符Pop(&opnd,&b); /彈出兩個操作數(shù)Pop(&opnd,&a);s=Operate(a,c,b); /將則兩個操作數(shù)根據(jù)運(yùn)算符進(jìn)行計(jì)算Push(&opnd, s); /將計(jì)算結(jié)果重新壓入棧中pSuffix+; /查找下一個操作數(shù)Pop(&opnd,&s); /彈出最終的計(jì)算結(jié)果free(opnd.base); /釋放順序表內(nèi)存return s;/*程序主函數(shù)*/int main()char infix80=0;/保存中綴表達(dá)式char suffix80=0;/保存后綴表達(dá)式 int result=0; /表達(dá)式的計(jì)算結(jié)果 printf("請輸入算術(shù)表達(dá)式:"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 劇院建筑工程委托施工合同
- 2025年度戶外廣告遮陽窗簾安裝與維護(hù)合同3篇
- 環(huán)保產(chǎn)業(yè)招商經(jīng)理招聘合同
- 西寧市物流配送中心租賃合同
- 信息技術(shù)服務(wù)合同指南
- 2025年農(nóng)民工勞動保障:勞動合同簽訂與解除法律咨詢3篇
- 2024標(biāo)準(zhǔn)化房產(chǎn)交易見證合同版B版
- 二零二五年度二手車買賣合同范本含車輛交易第三方支付協(xié)議3篇
- 2024年設(shè)備安全評估監(jiān)造服務(wù)合同精簡版3篇
- 污水處理炮工施工合同
- 噎食風(fēng)險評估和預(yù)防措施
- 幼兒繪本故事:小福變成大漢堡
- 常寶精特能源概況
- 政治經(jīng)濟(jì)學(xué)結(jié)構(gòu)圖解
- 服裝品質(zhì)管理人員工作手冊
- 國家開放大學(xué)電大??啤东F醫(yī)基礎(chǔ)》2023-2024期末試題及答案試卷編號:2776
- 初三畢業(yè)班后期管理措施
- 示教機(jī)械手控制系統(tǒng)設(shè)計(jì)
- 氧化鋁生產(chǎn)工藝教學(xué)(拜耳法)
- 選礦學(xué)基礎(chǔ)PPT課件
- 安利食品經(jīng)銷商合同協(xié)議范本模板
評論
0/150
提交評論