中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式并計(jì)算結(jié)果(C語(yǔ)言版)#精選._第1頁(yè)
中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式并計(jì)算結(jié)果(C語(yǔ)言版)#精選._第2頁(yè)
中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式并計(jì)算結(jié)果(C語(yǔ)言版)#精選._第3頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的規(guī)則。1. 遇到操作數(shù):直接輸入到后綴表達(dá)式棧2. 遇到運(yùn)算符,直接入操作符棧3. 遇到左括號(hào):直接將其入棧4. 遇到右括號(hào):執(zhí)行出棧操作,并將出棧的元素輸出,直到彈出棧的是左括號(hào),左括號(hào)不輸 出。5. 遇到其他運(yùn)算符:加減乘除:彈出所有優(yōu)先級(jí) 大于或者等于 該運(yùn)算符的棧頂元素,然后將 該運(yùn)算符入棧6. 最終將操作符棧中的元素依次出棧,輸出到后綴表達(dá)式棧。以下是自己寫的代碼。親測(cè)沒(méi)有問(wèn)題。 (模擬一個(gè)計(jì)算器,可以帶括號(hào),中間可以空格,只支持整數(shù)輸入,但是輸出結(jié)果精確到小數(shù)后 6 位)#include "stdio.h"#defi

2、ne MAX_LEN 100 typedef struct calunsigned char isOper;/ 是否是操作數(shù) 1,操作符0.操作數(shù)double Num;/值?;蛘呤遣僮鞣腁SCI值STRUCT_CAL;#define IS_NUM0x00#define IS_OPER0x01STRUCT_CAL stackCalMAX_LEN;STRUCT_CAL stackCalBackMAX_LEN; unsigned char topCal;char stackOperMAX_LEN;unsigned char topOper;/* 堆棧初始化*/ void stackInit(voi

3、d)int i; for(i=0;i<MAX_LEN;i+) stackCali.isOper = 0; stackCali.Num = 0; stackOperi = 0; topCal = topOper = 0;/* * 返回堆棧的棧頂,返回后棧頂減一*/ STRUCT_CAL * stackCalPop(void)if(topCal = 0)return (STRUCT_CAL *)0;return stackCal+(-topCal);/* 計(jì)算表達(dá)式入棧*/ void stackCalPush(double num, unsigned char isOper) if(topC

4、al>=MAX_LEN)return;stackCaltopCal.Num = num; stackCaltopCal.isOper= isOper;topCal+; /* 操作符出棧*/ char stackOperPop(void)if(topOper = 0)return 0;return stackOper-topOper; * 操作符入棧*void stackOperPush(char oper)if(topOper >=MAX_LEN)return;stackOpertopOper+ = oper; /*比較兩個(gè) sour sour1 的優(yōu)先級(jí)*1 sour >=

5、 sour1 直接入操作符棧*0 sour < sour1直接入計(jì)算表達(dá)式棧*/ unsigned char comparPrior(char sour, char sour1)if(sour ='0' |sour1 = '0') return 1;switch(sour)case '+':case '-':if(sour1 = '*' |sour1 = '/'|sour1 = '+' |sour1 = '-' ) return 0;elsereturn 1;b

6、reak;case '*':case '/':if(sour1 = '*' |sour1 = '/'|sour1 = '+' |sour1 = '-'|sour1 = '(') return 1;else return 0;break;default:return 1;break;/* 將輸入的字符串轉(zhuǎn)換為棧*/void StrToCal(char *pStr)int tmpNum = 0;char tmpOper;char islastNum = 0;/ 判斷上一個(gè)字符是什么。如果

7、是符號(hào),現(xiàn)在碰到-',那么數(shù)字就是負(fù)數(shù)char isNumNegative = 0; while(*pStr != '0')switch(*pStr)case '+': while(comparPrior('+',stackOpertopOper-1) = 0) stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break;stackOperPush('+'); pStr+;islastNum = 0; break;case '-':if(isla

8、stNum = 0) / 如果上一個(gè)字符是 操作符,那么接下來(lái)的數(shù)字是負(fù)數(shù) isNumNegative = 1;/ 1 代表 是負(fù)數(shù) pStr+;break; while(comparPrior('-',stackOpertopOper-1) = 0) stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break;stackOperPush('-'); pStr+;islastNum = 0; break;case '*': while(comparPrior('*',s

9、tackOpertopOper-1) = 0) stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break;stackOperPush('*'); pStr+;islastNum = 0; break;case '/': while(comparPrior('/',stackOpertopOper-1) = 0) stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break;stackOperPush('/')

10、; pStr+;islastNum = 0; break;case '(': stackOperPush('('); pStr+;islastNum = 0; break;case ')': while(tmpOper = stackOperPop() != '(') stackCalPush(tmpOper, IS_OPER); pStr+;islastNum = 0;break;case '0':case '1':case '2':case '3':case &#

11、39;4': case '5':case '6':case '7':case '8':case '9':while(*pStr >='0' )&& (*pStr <='9')tmpNum = tmpNum *10 +*(pStr+) - '0'if(isNumNegative) isNumNegative = 0; tmpNum = -tmpNum;stackCalPush(tmpNum, IS_NUM);tmpNum = 0;is

12、lastNum = 1;break;case ' ':pStr+;break;default:pStr+;break;while(topOper) / 如果最后操作符棧還有數(shù)據(jù),直接入計(jì)算棧 stackCalPush(stackOperPop(), IS_OPER); /* 顯示轉(zhuǎn)換后的后綴表達(dá)式,用于調(diào)試,看轉(zhuǎn)換是否正確*/ void dispCalc(void)int i = 0;printf("n");for(i = 0;i<topCal;i+)if(stackCali.isOper = IS_NUM)printf("%d",

13、(int)stackCali.Num);else if(stackCali.isOper = IS_OPER) printf("%c",(char)stackCali.Num);/* 計(jì)算后綴表達(dá)式的計(jì)算結(jié)果*/void suffixExpression(void)int i = 0;int tmpTop;double num1,num2;for(i = 0;i<topCal;i+)stackCalBacki = stackCali;i = 0;tmpTop = topCal;topCal = 0;while(1)if(stackCalBacki.isOper = I

14、S_OPER)num1 = stackCalPop()->Num;num2 = stackCalPop()->Num; switch(char)stackCalBacki.Num) case '+':stackCalPush(num2+num1, IS_NUM); break;case '-': stackCalPush(num2-num1, IS_NUM); break;case '*':stackCalPush(num2*num1, IS_NUM); break;case '/': stackCalPush(int)num2/num1, IS_NUM); break;default :break;elsestackCalPush(stackCalBacki.Num, IS_NUM);i+;if(i>=tmpTop) break;printf("nThe result is : %fn", stackCal

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論