C語言表達(dá)式求值_第1頁
C語言表達(dá)式求值_第2頁
C語言表達(dá)式求值_第3頁
C語言表達(dá)式求值_第4頁
C語言表達(dá)式求值_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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<>#include<>#include<>#include<>#include<>/*宏定義*/#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){=(double*)malloc(INIT_STACK_SIZE*sizeof(double));=;=INIT_STACK_SIZE;}/*初始化字符棧*/voidinitStackC(SqStackC&S){=(char*)malloc(INIT_STACK_SIZE*sizeof(char));=;=INIT_STACK_SIZE;}/*向數(shù)字棧中存放數(shù)字*/voidpushN(SqStackN&S,doublex){if>=return;*++)=x;}/*向字符棧中存放字符*/voidpushC(SqStackC&S,charx){if->=return;*++)=x;}/*從數(shù)字棧中取出數(shù)字*/voidpopN(SqStackN&S,double&x){if==return;x=*;}/*從字符棧中取出字符*/voidpopC(SqStackC&S,char&x){if==return;x=*;}/*這個函數(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+*3-2#循環(huán)會從這個字符串第一個位置開始,也就是1如果當(dāng)前字符是個數(shù)字,則要把這個數(shù)字從字符串里取出來這個時候涉及兩個問題,一是數(shù)字可能是大于10的整數(shù),二是可能有小數(shù)。處理方法是這樣的:當(dāng)遇到數(shù)字,先將數(shù)字保存在n上,判斷下一個字符是數(shù)字還是運(yùn)算符如果是數(shù)字,則將n乘以10加上這個數(shù)字,這樣即可以處理大于10的數(shù)字。如果遇到運(yùn)算符,就退出循環(huán)去處理運(yùn)算符如果遇到的是小數(shù)點,表示這個數(shù)字是小數(shù)。小數(shù)不會立刻計算出來,而是先將小數(shù)點忽視掉,將整數(shù)計算出。比如會先計算成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次方。就變成了*/voidgetSolution(){/*operation是當(dāng)前的運(yùn)算符*/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]!='#'||*-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(*-1),temp[i])){/*如果棧頂字符優(yōu)先級大,則可以取出計算*/case'>':/*取出字符棧頂運(yùn)算符,和數(shù)字棧頂?shù)膬蓚€數(shù)字*/popC(OPTR,operation);popN(OPND,a);popN(OPND,b);/*計算結(jié)果*/sum=calculate(a,operation,b);/*結(jié)果入棧*/pushN(OPND,sum

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論