




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
/*表達(dá)式求值,輸入一個表達(dá)式,如1+2*3#,程序可計算出結(jié)果為7支持以下符號:+-*/()^.可以計算整數(shù)、小數(shù)其中^表示次方,2^5表示2的5次方*//*頭文件*/#include<stdio.h>#include<malloc.h>#include<string.h>#include<math.h>#include<stdlib.h>/*宏定義*/#defineINIT_STACK_SIZE100#defineSET_NUM8#defineN100/*字符優(yōu)先級表*/unsignedcharprior[SET_NUM][SET_NUM]={/*'+''-''*''/''('')''#''^'*//*'+'*/'>','>','<','<','<','>','>','<',/*'-'*/'>','>','<','<','<','>','>','<',/*'*'*/'>','>','>','>','<','>','>','<',/*'/'*/'>','>','>','>','<','>','>','<',/*'('*/'<','<','<','<','<','=','','<',/*')'*/'>','>','>','>','','>','>','>',/*'#'*/'<','<','<','<','<','','=','<',/*'^'*/'>','>','>','>','<','>','>','>'};unsignedcharpriorSet[SET_NUM]={'+','-','*','/','(',')','#','^'};/*結(jié)構(gòu)體定義,這是用來存放字符的棧*/typedefstruct{char*base;char*top;intstacksize;}SqStackC;/*結(jié)構(gòu)體定義,這是用來存放數(shù)字的棧*/typedefstruct{double*base;double*top;intstacksize;}SqStackN;voidinitStackN(SqStackN&);voidinitStackC(SqStackC&);voidpushN(SqStackN&,double);voidpushC(SqStackN&,double);voidpopN(SqStackN&,double&);voidpopC(SqStackN&,double&);doublecalculate(double,char,double);intfindInSet(char);charcompare(char,char);voidgetSolution();/*主函數(shù)*/voidmain(){getSolution();}/*初始化數(shù)字棧*/voidinitStackN(SqStackN&S){S.base=(double*)malloc(INIT_STACK_SIZE*sizeof(double));S.top=S.base;S.stacksize=INIT_STACK_SIZE;}/*初始化字符棧*/voidinitStackC(SqStackC&S){S.base=(char*)malloc(INIT_STACK_SIZE*sizeof(char));S.top=S.base;S.stacksize=INIT_STACK_SIZE;}/*向數(shù)字棧中存放數(shù)字*/voidpushN(SqStackN&S,doublex){if(S.top-S.base>=S.stacksize)return;*(S.top++)=x;}/*向字符棧中存放字符*/voidpushC(SqStackC&S,charx){if(S.top-S.base>=S.stacksize)return;*(S.top++)=x;}/*從數(shù)字棧中取出數(shù)字*/voidpopN(SqStackN&S,double&x){if(S.top==S.base)return;x=*(--S.top);}/*從字符棧中取出字符*/voidpopC(SqStackC&S,char&x){if(S.top==S.base)return;x=*(--S.top);}/*這個函數(shù)返回aoperationb的值。假如operation為'+',則返回a+b的值*/doublecalculate(doublea,charoperation,doubleb){/*判斷operation,返回對應(yīng)的計算結(jié)果*/switch(operation){case'+':returna+b;case'-':returnb-a;case'*':returna*b;case'/':returnb/a;case'^':returnpow(b,a);default:return0;}}/*查找字符c在priorSet中的什么位置*//*priorSet是所支持的所有字符的集合*/intfindInSet(charc){inti;for(i=0;i<SET_NUM;i++){if(priorSet[i]==c)returni;}return-1;}/*比較optrtop和c的優(yōu)先關(guān)系*/charcompare(charoptrtop,charc){inti,j;/*從priorSet中取出optrtop和c的位置*/i=findInSet(optrtop);j=findInSet(c);/*如果返回值中有-1表示這個符號不支持,結(jié)束程序*/if(i==-1||j==-1){printf("不支持的符號類型\n");exit(0);}/*否則返回二者優(yōu)先級關(guān)系*/elsereturnprior[i][j];}/*取得計算結(jié)果*//*解釋下代碼處理數(shù)字的原理:假如輸入為10+2.2*3-2#循環(huán)會從這個字符串第一個位置開始,也就是1如果當(dāng)前字符是個數(shù)字,則要把這個數(shù)字從字符串里取出來這個時候涉及兩個問題,一是數(shù)字可能是大于10的整數(shù),二是可能有小數(shù)。處理方法是這樣的:當(dāng)遇到數(shù)字,先將數(shù)字保存在n上,判斷下一個字符是數(shù)字還是運算符如果是數(shù)字,則將n乘以10加上這個數(shù)字,這樣即可以處理大于10的數(shù)字。如果遇到運算符,就退出循環(huán)去處理運算符如果遇到的是小數(shù)點,表示這個數(shù)字是小數(shù)。小數(shù)不會立刻計算出來,而是先將小數(shù)點忽視掉,將整數(shù)計算出。比如2.2會先計算成22變量j和begin在遇到小數(shù)點時候用來計算小數(shù)點后面有幾個數(shù)字,即這個小數(shù)有多少位。當(dāng)begin=1時候,表示現(xiàn)在要計算小數(shù)點后的數(shù)字位數(shù)。這時候j會在每次循環(huán)加1這樣計算后,n=22,j=1;此時算n=n/pow(10,j);即將n縮小10的j次方。就變成了2.2*/voidgetSolution(){/*operation是當(dāng)前的運算符*/charoperation;/*temp是輸入的字符串*/chartemp[N];/*i是循環(huán)變量,j和begin用來控制什么時候計算出小數(shù)*/inti=0,j=-1,begin=0;/*sum是每次的計算結(jié)果,a和b是從數(shù)字棧中取出的數(shù)字,n用來存放從字符串中取出的數(shù)*/doublesum,a,b,n;/*定義堆棧并初始化*/SqStackCOPTR;SqStackNOPND;initStackC(OPTR);initStackN(OPND);/*向字符棧中壓入#,標(biāo)志開始*/pushC(OPTR,'#');/*獲得輸入*/printf("請輸入一個表達(dá)式,輸入#結(jié)束\n");gets(temp);/*開始計算,當(dāng)遇到#表示結(jié)束*/while(temp[i]!='#'||*(OPTR.top-1)!='#'){/*如果當(dāng)前字符是個數(shù)字字符*/if(temp[i]>='0'&&temp[i]<='9'){/*重置n為0*/n=0;/*當(dāng)當(dāng)前字符是數(shù)字或者小數(shù)點*/while(temp[i]>='0'&&temp[i]<='9'||temp[i]=='.'){/*如果是小數(shù)點,begin=1,表示要從字符串中取出一個小數(shù)*/if(temp[i]=='.')begin=1;/*否則作為整數(shù)取出*/else n=n*10+temp[i]-'0';/*如果begin不為0,表示遇到了一個小數(shù)點,表示需要合并為小數(shù)*//*j表示這個小數(shù)的小數(shù)點后面有幾位*/if(begin!=0)j++;/*循環(huán)變量加1*/i++;}/*如果j不為-1,則表示這是個小數(shù),n是整數(shù)結(jié)果,除以pow(10,j)則變成了小數(shù)*/if(j!=-1)n=n/pow(10,j);/*將數(shù)字壓入棧*/pushN(OPND,n);/*重置j和begin的值*/j=-1;begin=0;}else{/*如果當(dāng)前字符不是數(shù)字,比較棧頂字符和當(dāng)前字符優(yōu)先級,根據(jù)優(yōu)先級處理*/switch(compare(*(OPTR.top-1),temp[i])){/*如果棧頂字符優(yōu)先級大,則可以取出計算*/case'>':/*取出字符棧頂運算符,和數(shù)字棧頂?shù)膬蓚€數(shù)字*/popC(OPTR,operation);popN(OPND,a);popN(OPND,b);/*計算結(jié)果*/sum=calculate(a,operation,b);/*結(jié)果入棧*/pushN(OPND,
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 23093-5:2025 EN Information technology - Internet of media things - Part 5: IoMT autonomous collaboration
- 對保險行業(yè)的認(rèn)識
- 安全教育記心中(人教版)
- 汽車行業(yè)智能倉儲系統(tǒng)
- 企業(yè)管理應(yīng)知應(yīng)會
- 郵政禁毒知識培訓(xùn)課件
- 加強學(xué)校國防教育
- 寧夏衛(wèi)生健康職業(yè)技術(shù)學(xué)院《民俗文化》2023-2024學(xué)年第二學(xué)期期末試卷
- 喀什大學(xué)《環(huán)境影響評價技術(shù)方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 石家莊學(xué)院《雙語食品機械與設(shè)備》2023-2024學(xué)年第一學(xué)期期末試卷
- 2023年生態(tài)環(huán)境綜合行政執(zhí)法考試參考題庫(400題)
- 河北省高中學(xué)業(yè)水平考試通用技術(shù)試題
- 沉浸式教學(xué)在初中英語閱讀教學(xué)中的實踐與研究 論文
- 馬原第七章共產(chǎn)主義崇高理想及其最終實現(xiàn)
- 投標(biāo)前期顧客滿意度調(diào)查表
- 青島版科學(xué)(2017)六三制六年級下冊14.《有趣的碰碰球》教學(xué)課件
- JJF 1281-2011煙草填充值測定儀校準(zhǔn)規(guī)范
- GB/T 5271.31-2006信息技術(shù)詞匯第31部分:人工智能機器學(xué)習(xí)
- GB/T 21302-2007包裝用復(fù)合膜、袋通則
- GB/T 14273-1993旋轉(zhuǎn)軸唇形密封圈性能試驗方法
- GB 13326-1991組合式空氣處理機組噪聲限值
評論
0/150
提交評論