版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告實(shí)驗(yàn)一:設(shè)計(jì)要求1、問(wèn)題描述:設(shè)計(jì)一個(gè)計(jì)算器,可以實(shí)現(xiàn)計(jì)算器的簡(jiǎn)單運(yùn)算,輸出并檢驗(yàn)結(jié)果的正確性,以及檢驗(yàn)運(yùn)算表達(dá)式的正確性。2、輸入:不含變量的數(shù)學(xué)表達(dá)式的中綴形式,可以接受的操作符包括+、-、*、/、(、)。具體事例如下:3、輸出:如果表達(dá)式正確,則輸出表達(dá)式的正確結(jié)果;如果表達(dá)式非法,則輸出錯(cuò)誤信息。具體事例如下:知識(shí)點(diǎn):堆棧、隊(duì)列實(shí)際輸入輸出情況:正確的表達(dá)式對(duì)負(fù)數(shù)的處理d:documentsvisualstudio2012ProjectsProject1DebugProject1.exe達(dá).a-*3果意入2>結(jié)6任表達(dá)式括號(hào)不匹配d:docurnentsvis
2、ualstudio2012PrqjectsProject1DebugProject1.exe力、1有配四號(hào)括續(xù)怪Sr二:果誤止意人結(jié)靖厘徇+2算入序按有K3運(yùn)輸程請(qǐng)表達(dá)式出現(xiàn)非法字符匕匕RD不間號(hào)符知續(xù)和隹果誤止意H小5俞邑青表達(dá)式中操作符位置錯(cuò)誤d:documentsvisualstudio2012ProjectsProject1DebugProject1.exe入、IQ麗、x匚k窠實(shí)運(yùn)繼暑火止髓結(jié)錯(cuò)以1T算入序技求余操作符左右出現(xiàn)非整數(shù)d:documentsvisualstudio2012ProjectsProject1DebugProject1.exeI®i加、減、乘中間不能:
3、求模操作只能信用于整數(shù)除露鍵/其他輸入錯(cuò)誤數(shù)據(jù)結(jié)構(gòu)與算法描述解決問(wèn)題的整體思路:將用戶輸入的中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式,再利用轉(zhuǎn)換后的后綴表達(dá)式進(jìn)行計(jì)算得出結(jié)果。解決本問(wèn)題所需要的數(shù)據(jù)結(jié)構(gòu)與算法:用到的數(shù)據(jù)結(jié)構(gòu)是堆棧。主要算法描述如下:A.將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式:1.將中綴表達(dá)式從頭逐個(gè)字符掃描,在此過(guò)程中,遇到的字符有以下兒種情況:1)數(shù)字2)小數(shù)點(diǎn)3)合法操作符+-*/%4)左括號(hào)5)右括號(hào)6)非法字符2 .|首,先為操作符初始化一個(gè)map<std:string,int>priority,用于保存各個(gè)操作符的優(yōu)先級(jí),其中+-為0,*/%為13 .對(duì)于輸入的字符串from和
4、輸出的字符串to,采用以下過(guò)程:初始化遍歷器std::string::iteratorit=()在當(dāng)=執(zhí)行如下操作4 .遇到數(shù)字或小數(shù)點(diǎn)時(shí)將其加入到后綴表達(dá)式:case'I':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9:case0:case'.':to=to+*it;break;)5 .遇到操作符(+,*,/,%)時(shí),如果此時(shí)棧頂操作符的優(yōu)先級(jí)比此時(shí)的操作符優(yōu)先級(jí)
5、低,則將其入棧,否則將棧中的操作符從棧頂逐個(gè)加入到后綴表達(dá)式,直到??栈蛘哂龅阶罄ㄌ?hào),并將此時(shí)的操作符加入到棧中,在此過(guò)程中需判斷表達(dá)式中是否出現(xiàn)輸入錯(cuò)誤:case'+':case',:case':case'/':case':(if(it+l)=O)(cout«輸入錯(cuò)誤:運(yùn)算符號(hào)右邊缺少運(yùn)算數(shù)<<endl;returnfalse;if(*it=二'二二'/')&&讓二二()cout<<輸入錯(cuò)誤:運(yùn)算符號(hào)左邊缺少運(yùn)算數(shù)。endl;returnfalse;)if(it+
6、l)!=()&&(*(it+l)=,+'|*(it+l)=,|*(it+l)=,*'|*(it+l)='/'I|='%')(cout«輸入錯(cuò)誤:運(yùn)算符號(hào)連續(xù)出現(xiàn)。endl;returnfalse;)to=to+,/;ifO)(*it);break;)tem=0;while(pri*it<=pri()&&tem!=,(?)(0;if()break;tem=();(*it);break;)6 .遇到“(”時(shí),直接將其加入操作符棧,并且檢測(cè)輸入錯(cuò)誤,并且當(dāng)括號(hào)后的第一個(gè)符號(hào)為-時(shí),說(shuō)明用戶試圖輸入負(fù)號(hào),這
7、種情況我們向目標(biāo)表達(dá)式輸出一個(gè)0,以達(dá)到處理負(fù)號(hào)的目的:case'(':if(it+l)=O)(cout<<輸入錯(cuò)誤:表達(dá)式以左括號(hào)結(jié)尾。endl;returnfalse;至IJ“)”時(shí),將棧中的操作符從棧頂逐個(gè)彈出并放入后綴表達(dá)式中,直到在棧中遇到“(”,并將“從棧中彈出:case')':if(it+l)!=()&&*(it+l)!=+'&&*(it+l)!=-&&*(it+l)!='*'&&*(it+l)!=r!='%'&&*(
8、it+l)!=)')cout«輸入錯(cuò)誤:右括號(hào)右邊不能為運(yùn)算數(shù)。endl;returnfalse;)if(it!=()&&(*(it-l)=,+*|*(it-l)=,|*(it-l)=,|)=,/,u*(itI)='%')(cout«輸入錯(cuò)誤:右括號(hào)左邊不能為運(yùn)算符號(hào)<<endl;returnfalse;)to=to+/,;ifO)(cout。輸入錯(cuò)誤:表達(dá)式以右括號(hào)開始Gendl;returnfalse;)tem=();to=to+tem+0;ifO)coutG輸入錯(cuò)誤:括號(hào)匹配有誤<<endl;return
9、false;)tem=();0;break;)B.計(jì)算后綴表達(dá)式的主要思想:逐個(gè)字符的掃描后綴表達(dá)式,遇到單個(gè)數(shù)字或小數(shù)點(diǎn)時(shí)則先將其將其存到一個(gè)字符串中,當(dāng)遇到后綴表達(dá)式中的分隔符(這里使用空格)時(shí),則將這個(gè)字符串轉(zhuǎn)化為數(shù)字放到堆棧numstack中:case'r:case'2':case'3':case'4':case'5':case6':case'T:case'8':case'9:case'0:case'.':(numtemp+=*it;break;),c
10、ase:if(numtemp!=")(if)+1)!=string::npos)cout«z/輸入錯(cuò)誤:小數(shù)點(diǎn)數(shù)目超出:,+numtemp<<endl;returnfalse;)(numtemp);strm»d;(d);numtemp二;();0;break;)break;)2.遇到操作符+,-,*,/,的時(shí),將堆棧numstack中的棧頂?shù)膬蓚€(gè)數(shù)取出來(lái),進(jìn)行相應(yīng)操作的運(yùn)算,并將結(jié)果加入到堆棧numstack中;case'+':d2=();0;dl=();0;(dl+d2);break;)case'-':d2=();0;
11、dl=();0;(dl-d2);break;)case'*':d2=();0;dl=();0;(dl*d2);break;)case'/':(d2=();0;if(fabs(d2)<(cout«輸入錯(cuò)誤:除數(shù)不能為0endl;returnfalse;dl=();0;(dl/d2);break;d2=();0;dl=();0;if(fabs(d2"(int)d2)<&&(fabs(dl(int)dl)<(intnl=(int)dl;intn2=(int)d2;(double)(nl%n2);break;)els
12、e(cerr«輸入錯(cuò)誤:求模操作只能作用于整數(shù)*endl;returnfalse;)3.直到后綴表達(dá)式掃描完并且堆棧numstack中只有一個(gè)數(shù)值,則此數(shù)值為計(jì)算的最終結(jié)果,否則說(shuō)明輸入有誤。分析與探討:1、測(cè)試結(jié)果分析:測(cè)試結(jié)果見本篇開始的實(shí)際輸入輸出結(jié)果。該計(jì)算器幾乎實(shí)現(xiàn)了所有相關(guān)功能,包括簡(jiǎn)單計(jì)算、負(fù)數(shù)小數(shù)處理,容錯(cuò),并且健壯性好,對(duì)于錯(cuò)誤的表達(dá)式可以給出適當(dāng)提示,不會(huì)導(dǎo)致程序崩潰。2、算法分析1、對(duì)于中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式:時(shí)間復(fù)雜性為0(n)2、對(duì)于后綴表達(dá)式的計(jì)算:時(shí)間復(fù)雜性為0(n)綜上,該程序算法的時(shí)間復(fù)雜度為0(n)3、算法改進(jìn)該程序存在的主要問(wèn)題是命令行式的用
13、戶界面不夠友好。Windows下的用戶圖形界面需要MFC方面的知識(shí),因?yàn)闀r(shí)間關(guān)系沒(méi)有進(jìn)行這方面的深入學(xué)習(xí)。附錄:源代碼文件一.#include<string>ttinclude<map>#include<stack>ftinclude<iostream>ftinclude<sstream>usingnamespacestd;classExpressionHandlerpublic:ExpressionHandler(stringexp)this->exp=exp;)boolinfixtoprofix(string&exp
14、);booldoprofix(stringprofix,double&result);private:stringexp;);文件二.*to=to+*it;break;)case':case'-':case':case':case飛':cout<<輸入錯(cuò)誤:運(yùn)算符號(hào)右邊缺少運(yùn)算數(shù)"Gendl;returnfalse;)二二|:*it=,/')&&it=()(cout«輸入錯(cuò)誤:運(yùn)算符號(hào)左邊缺少運(yùn)算數(shù)<<endl;returnfalse;if(it+1)!=()&&
15、amp;(*(it+l)=,+'|*(it+l)='-'Il*(it+l)='|*(it+l)='/'|*(it+1)='%')(cout«輸入錯(cuò)誤:運(yùn)算符號(hào)連續(xù)出現(xiàn)Gendl;returnfalse;to=to+,/”;ifO)(*it);break;tem=();while(pri*it<=pri()&&tem!=,(J)to=to+tem+”0;if()break;tem=();(*it);break;casecout<<輸入錯(cuò)誤:表達(dá)式以左括號(hào)結(jié)尾。endl;returnfals
16、e;if(*(it+l)="-|*(it+l)=+')if(it+1)!=()&&(*(it+l)='*'|l*(it+l)=,/'|*(it+l)='%'|*(it+l)=)(cout«輸入錯(cuò)誤:左括號(hào)右邊不能為運(yùn)算符號(hào)或右括號(hào)"<<endl;returnfalse;if(it!=()&&(*(it-l)!='+'&&*(it-l)!=-!=*')!=P&&*(it-l)!=%f&&*(it-l)!=
17、(')(cout«輸入錯(cuò)誤:左括號(hào)左邊不能為運(yùn)算數(shù)或右括號(hào)"<<endl;returnfalse;)(*it);break;)if(it+l)!=()&&*(it+l)!='+'&&*(it+l)!=-&&*(it+l)!='*'&&*(it+1)!=P&&*(it+l)!='%'&&*(it+l)!=')')(cout«輸入錯(cuò)誤:右括號(hào)右邊不能為運(yùn)算數(shù)。endl;returnfalse
18、;)if(it!=()&&(*(it-l)='+'|*(it-l)=,|*(it-l)=,|*(itT)='/'i|*(itT)='%')(cout<<輸入錯(cuò)誤:右括號(hào)左邊不能為運(yùn)算符號(hào)“endl;returnfalse;)to=to+;ifO)(cout<<輸入錯(cuò)誤:表達(dá)式以右括號(hào)開始endl;returnfalse;)tem=();to=to+tem+0;ifO)coutG輸入錯(cuò)誤:括號(hào)匹配有誤Gendl;returnfalse;tem=();)0;break;)default:(cout<<
19、;"輸入錯(cuò)誤:未知符號(hào)“<<endl;returnfalse;)+it;)to=to+tem=();while(!()(if(tem=C)cout<<輸入錯(cuò)誤:括號(hào)匹配有誤。endl;returnfalse;)to=to+tem+,z;0;if()break;tem=();)exp=to;returntrue;boolExpressionHandler::doprofix(stringprofix,double&result)stringnumtemp;stack<double>numstack;stringstreamstrm;doubl
20、ed,dl,d2;for(string:iteratorit=();it!=();+it)(switch(*it)(case'r:case'2':case3':case'4':case'5':case6':case'T:case'8':case'9':case'O':case.':(numtemp+=*it;break;)case':(if(numtemp!="')(if('.')&&(')+1
21、)!=string::npos)cout«z/輸入錯(cuò)誤:小數(shù)點(diǎn)數(shù)目超出:,+numtemp<<endl;returnfalse;(numtemp);strm»d;(d);numtemp=();0;break;break;)case'+':(d2=();0;dl=();0;(dl+d2);break;)case-':(12=();0;dl=();0;(dl-d2);break;)case'*':(d2=();0;(11=0;0;(dl*d2);break;d2=();0;if(fabs(d2)<cout<<輸入錯(cuò)誤:表達(dá)式中沒(méi)有合法運(yùn)算數(shù)Gendl
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度朝鮮鈦礦進(jìn)出口稅收優(yōu)惠政策咨詢合同4篇
- 2025年度出租車行業(yè)司機(jī)招聘與智能化運(yùn)營(yíng)服務(wù)合同4篇
- 二零二五年度采沙場(chǎng)資源整合承包合同4篇
- 2025重慶市奧體中心安全圍欄修建合同
- 2025辦公家具采購(gòu)合同范本
- 2025存單質(zhì)押擔(dān)保合同
- 2025年度二零二五年度鋼廠廢鋼回收與再生資源綜合利用合同2篇
- 2025太原市購(gòu)房合同范本
- 2025版?zhèn)€人借款借條制作及法律風(fēng)險(xiǎn)評(píng)估服務(wù)合同3篇
- 2025技術(shù)轉(zhuǎn)讓合同范本2
- 課題申報(bào)書:GenAI賦能新質(zhì)人才培養(yǎng)的生成式學(xué)習(xí)設(shè)計(jì)研究
- 潤(rùn)滑油知識(shí)-液壓油
- 2024年江蘇省中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 駱駝祥子-(一)-劇本
- 全國(guó)醫(yī)院數(shù)量統(tǒng)計(jì)
- 《中國(guó)香文化》課件
- 2024年醫(yī)美行業(yè)社媒平臺(tái)人群趨勢(shì)洞察報(bào)告-醫(yī)美行業(yè)觀察星秀傳媒
- 第六次全國(guó)幽門螺桿菌感染處理共識(shí)報(bào)告-
- 天津市2023-2024學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 經(jīng)濟(jì)學(xué)的思維方式(第13版)
- 盤錦市重點(diǎn)中學(xué)2024年中考英語(yǔ)全真模擬試卷含答案
評(píng)論
0/150
提交評(píng)論