版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)(論文)</b></p><p> 題 目 名 稱(chēng) 表達(dá)式求值問(wèn)題 </p><p> 課 程 名 稱(chēng) 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p> 學(xué) 生 姓 名 XXX <
2、/p><p> 學(xué) 號(hào) xxxxxxxxx </p><p> 系 、專(zhuān) 業(yè) 信息工程系、信息工程類(lèi) </p><p> 指 導(dǎo) 教 師 xxxxxx </p><p> 2010年 1 月 3 日<
3、;/p><p><b> 目 錄</b></p><p><b> 1 問(wèn)題描述2</b></p><p><b> 2 需求分析2</b></p><p><b> 3 概要設(shè)計(jì)2</b></p><p> 3.1抽
4、象數(shù)據(jù)類(lèi)型定義2</p><p><b> 3.2模塊劃分3</b></p><p><b> 4 詳細(xì)設(shè)計(jì)4</b></p><p> 4.1數(shù)據(jù)類(lèi)型的定義4</p><p> 4.2主要模塊的算法描述4</p><p><b> 5 測(cè)試分析
5、7</b></p><p> 5.1程序運(yùn)行結(jié)果7</p><p> 5.2程序調(diào)試與體會(huì).........................................................................8</p><p> 6 課程設(shè)計(jì)總結(jié)8</p><p><b> 參考
6、文獻(xiàn)8</b></p><p> 附錄(源程序清單)9</p><p><b> 1 問(wèn)題描述</b></p><p> 編寫(xiě)一個(gè)表達(dá)式求值程序,使輸入一個(gè)四則運(yùn)算表達(dá)式后,能夠返回正確的結(jié)果。該表達(dá)式由數(shù)字0~9、+、-、*、/、括號(hào)組成,且表達(dá)式必須正確無(wú)誤。程序的編寫(xiě)可用到?;蜿?duì)列的基本算法,求出該表達(dá)式的值,并分析
7、算法的時(shí)間復(fù)雜度和運(yùn)算的結(jié)果。</p><p><b> 2 需求分析</b></p><p> ?。?)為實(shí)現(xiàn)算符優(yōu)先算法,可以使用兩個(gè)工作棧。一個(gè)稱(chēng)做OPTR,用以寄存運(yùn)算符;另一個(gè)稱(chēng)做OPND;用以寄存操作數(shù)或運(yùn)算結(jié)果。算法的基本思想是:</p><p> ?、偈紫戎貌僮鲾?shù)棧為空棧,表達(dá)式起始符“#”為運(yùn)算符棧的棧底元素; </p
8、><p> ?、谝来巫x入表達(dá)式中每個(gè)字符,若是操作數(shù)則OPND棧,若是運(yùn)算符,則和OPTR棧的棧頂運(yùn)算符比較優(yōu)先權(quán)后做相應(yīng)操作,直至整個(gè)表達(dá)式求值完畢(即OPTR棧的棧頂元素和當(dāng)前讀入的字符均為"#")。</p><p> ?。?)該程序?qū)崿F(xiàn)表達(dá)式的求值問(wèn)題:</p><p> 從鍵盤(pán)讀入一個(gè)合法的算術(shù)表達(dá)式,利用算符優(yōu)先關(guān)系,實(shí)現(xiàn)對(duì)算術(shù)四則混合運(yùn)
9、算的求值,輸出正確的結(jié)果。</p><p><b> 3 概要設(shè)計(jì)</b></p><p> 3.1抽象數(shù)據(jù)類(lèi)型定義</p><p> 設(shè)定棧抽象數(shù)據(jù)類(lèi)型的定義采用兩個(gè)棧的入棧與出棧的操作來(lái)進(jìn)行“運(yùn)算符和操作數(shù)的配對(duì)”。程序中主要用到以下抽象數(shù)據(jù)類(lèi)型:</p><p> 1)ADT Stack {</p&g
10、t;<p> 數(shù)據(jù)對(duì)象:D={ ai | ai ∈ElemSet, i=2,...,n, </p><p><b> n≥0 }</b></p><p> 數(shù)據(jù)關(guān)系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }</p><p> 約定an 端為棧頂,a1 端為棧底。<
11、;/p><p><b> 基本操作:</b></p><p> (1)InitStack(&S) </p><p> 操作結(jié)果:構(gòu)造一個(gè)空棧S。</p><p> ?。?)GetTop(S, &e) </p><p> 初始條件:棧S已存在且非空。<
12、/p><p> 操作結(jié)果:用e返回S的棧頂元素。</p><p> (3)Push(&S, e) </p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:插入元素e為新的棧頂元素。</p><p> ?。?)StackEmpty(&s) </p>&
13、lt;p> 初始條件: 棧S已存在。</p><p> 操作結(jié)果:若S為空棧,則返回TRUE, 否則返回FALSE</p><p> ?。?)Pop(&S, &e) </p><p> 初始條件:棧S已存在且非空。</p><p> 操作結(jié)果:刪除S的棧頂元素,并用e返回其值。</p>
14、<p> } ADT Stack</p><p><b> 3.2模塊劃分</b></p><p> 本程序包括三個(gè)模塊:</p><p><b> (1)主函數(shù)模塊</b></p><p> void main()</p><p><b>
15、 { 輸入表達(dá)式;</b></p><p> 根據(jù)要求進(jìn)行轉(zhuǎn)換并求值;</p><p><b> 輸出結(jié)果;}</b></p><p> (2)表達(dá)式求值模塊-----實(shí)現(xiàn)具體求值</p><p> ?。?)表達(dá)式轉(zhuǎn)換模塊-----實(shí)現(xiàn)轉(zhuǎn)換。</p><p> 三模塊之間簡(jiǎn)單
16、調(diào)用關(guān)系:</p><p> 圖3.2 模塊調(diào)用圖</p><p><b> 4 詳細(xì)設(shè)計(jì)</b></p><p> 4.1數(shù)據(jù)類(lèi)型的定義</p><p><b> ?。?)棧類(lèi)型</b></p><p> #define MAXSIZE 100</p>
17、<p> typedef int elmtype;</p><p> struct sqstack</p><p><b> {</b></p><p> elmtype stack[MAXSIZE];</p><p><b> int top;</b></p>
18、<p><b> };</b></p><p><b> ?。?)運(yùn)算符號(hào)類(lèi)型</b></p><p> char ch[7]={'+','-','*','/','(',')','#'};</p><
19、p> (3)運(yùn)算符號(hào)優(yōu)先級(jí)類(lèi)型</p><p> int f1[7]={3,3,5,5,1,6,0};/*棧內(nèi)元素優(yōu)先級(jí)*/</p><p> int f2[7]={2,2,4,4,6,1,0};/*棧外元素優(yōu)先級(jí)*/</p><p> 4.2主要模塊的算法描述</p><p> 該程序主要由主函數(shù)模塊、表達(dá)式求值模塊、表達(dá)式
20、轉(zhuǎn)換模塊三個(gè)個(gè)部分組成。</p><p> ?。?)主函數(shù)及表達(dá)式求值模塊</p><p> void main()</p><p><b> {</b></p><p> int result;</p><p> result=EvaluateExpression(); /*對(duì)Eva
21、luateExpression()進(jìn)行調(diào)用*/ }</p><p> ?。?)表達(dá)式求值模塊</p><p> 主函數(shù)只調(diào)用了EvaluateExpression()函數(shù);而其他的函數(shù)則由EvaluateExpression()調(diào)用了,因此使得主函數(shù)十分簡(jiǎn)潔明了。其中求值函數(shù)流程圖如下:</p><p> 圖4.2 表達(dá)式求值模塊流程圖</p>
22、<p> (3)表達(dá)式轉(zhuǎn)換模塊</p><p> void trans(char *exp,char *postexp)</p><p><b> {</b></p><p> 在本函數(shù)中先初始化一個(gè)OP棧,依次讀入表達(dá)式中的每個(gè)字符,若是運(yùn)算符就進(jìn)OP棧,若運(yùn)算符則與OP棧進(jìn)行比較,直至整個(gè)表達(dá)式轉(zhuǎn)換完畢。</p&g
23、t;<p><b> }</b></p><p> float compvalue(char *postexp){ </p><p><b> struct </b></p><p><b> { </b></p><p> float data[Max
24、Size]; </p><p><b> int top; </b></p><p><b> } st;</b></p><p><b> 5 測(cè)試分析</b></p><p> 5.1程序運(yùn)行結(jié)果: </p><p> 5.2程序調(diào)試與體會(huì)
25、</p><p> 運(yùn)用棧的基本操作順利的解決表達(dá)式求值及轉(zhuǎn)換問(wèn)題,主要利用棧的先進(jìn)后出結(jié)構(gòu),執(zhí)行出棧進(jìn)棧操作并在出棧時(shí)進(jìn)行配對(duì)并輸出配對(duì)情況,而整個(gè)過(guò)程不需要不需要移動(dòng)元素使程序在空間復(fù)雜度上降到最小,采用指針的移動(dòng)大大加快了程序的執(zhí)行效率。并且對(duì)輸入進(jìn)行了改進(jìn),以防止用戶(hù)隨意輸入時(shí)出現(xiàn)的各種意想不到的錯(cuò)誤。系統(tǒng)整體上比較完美,無(wú)論是輸入、輸出,還是整個(gè)系統(tǒng)的界面,都非常美觀、簡(jiǎn)潔、大方</p>
26、<p><b> 6 課程設(shè)計(jì)總結(jié)</b></p><p> 通過(guò)這段時(shí)間的課程設(shè)計(jì),本人對(duì)計(jì)算機(jī)的應(yīng)用、數(shù)據(jù)結(jié)構(gòu)的作用以及C語(yǔ)言的使用都有了更深的了解。在理論學(xué)習(xí)和上機(jī)實(shí)踐的各個(gè)環(huán)節(jié)中,通過(guò)自主學(xué)習(xí)和請(qǐng)教陳智、成婭輝老師,我收獲了不少。當(dāng)然也遇到不少問(wèn)題,也正是因?yàn)檫@些問(wèn)題引發(fā)的思考給我?guī)?lái)了收獲。從當(dāng)初不喜歡上機(jī)寫(xiě)程序到現(xiàn)在能主動(dòng)寫(xiě)程序,從當(dāng)初拿著程序不知從何下手道現(xiàn)在知
27、道如何分析問(wèn)題,如何用專(zhuān)業(yè)知識(shí)解決實(shí)際問(wèn)題的轉(zhuǎn)變。我發(fā)現(xiàn)無(wú)論是專(zhuān)業(yè)知識(shí)還是動(dòng)手能力,自己都有很大程度的提高。</p><p> 在實(shí)際上機(jī)操作過(guò)程中,不僅是讓我們了解數(shù)據(jù)結(jié)構(gòu)的理論知識(shí),更重要的是培養(yǎng)解決實(shí)際問(wèn)題的能力。所以相信通過(guò)此次課程設(shè)計(jì)實(shí)習(xí)可以提高我們分析設(shè)計(jì)能力和編程能力,為后續(xù)課程的學(xué)習(xí)及實(shí)踐打下良好的基礎(chǔ)。</p><p> 在這次短短的課程實(shí)踐里,我得到了陳智老師的關(guān)心
28、和幫助。他給了我們很多的信息,與我們一起探討問(wèn)題,詢(xún)問(wèn)我們遇到了哪些問(wèn)題并耐心給予指導(dǎo)。當(dāng)我們遇到技術(shù)上難以解決的問(wèn)題時(shí),他就會(huì)指導(dǎo)我們解決問(wèn)題,他把自己多年來(lái)積累的經(jīng)驗(yàn)傳授給我們,是我們順利的完成了課程設(shè)計(jì)的任務(wù)。再一次感謝給予我指導(dǎo)及幫助的老師和同學(xué)們! </p><p><b> 參考文獻(xiàn)</b></p><p> [1] 黃同成,黃俊民,董建寅.?dāng)?shù)據(jù)結(jié)構(gòu)[
29、M].北京:中國(guó)電力出版社,2008</p><p> [2] 董建寅,黃俊民,黃同成.?dāng)?shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)指導(dǎo)與題解[M].北京:中國(guó)電力出版社,2008</p><p> [3] 嚴(yán)蔚敏,吳偉民. 數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)[M]. 北京:清華大學(xué)出版社,2002</p><p> [4] 劉振鵬,張曉莉,郝杰.?dāng)?shù)據(jù)結(jié)構(gòu)[M].北京:中國(guó)鐵道出版社,2003</p
30、><p><b> 附錄(源程序清單)</b></p><p> #include <conio.h></p><p> #include <stdio.h></p><p> #include <ctype.h></p><p> #define MAX
31、SIZE 100</p><p> typedef int elmtype;</p><p> typedef struct sqstack sqstack;</p><p> char ch[7]={'+','-','*','/','(',')','#
32、39;};</p><p> int f1[7]={3,3,5,5,1,6,0};/*棧內(nèi)元素優(yōu)先級(jí)*/</p><p> int f2[7]={2,2,4,4,6,1,0};/*棧外元素優(yōu)先級(jí)*/</p><p><b> int n=0;</b></p><p> struct sqstack</p&g
33、t;<p> {elmtype stack[MAXSIZE];</p><p><b> int top;</b></p><p><b> };</b></p><p> void Initstack(sqstack *s)</p><p> { s->top=0;&
34、lt;/p><p><b> }</b></p><p> int StackEmpty(sqstack S )</p><p> { if( S.top==0 ) return 1;</p><p> else return 0;}</p><p> void Push(sqstac
35、k *s,elmtype x)</p><p> {if(s->top==MAXSIZE-1)</p><p> printf("ERROR,Overflow!\n");</p><p><b> else</b></p><p> { s->top++;</p>&
36、lt;p> s->stack[s->top]=x;}</p><p><b> }</b></p><p> void Pop(sqstack *s,elmtype *x)</p><p> {if(s->top==0)</p><p> printf("ERROR,Under
37、flow!\n");</p><p><b> else</b></p><p> {*x=s->stack[s->top];</p><p> s->top--;}</p><p><b> }</b></p><p> elmtype
38、 Gettop(sqstack s)</p><p><b> {</b></p><p> if(s.top==0)</p><p> { printf("ERROR,underflow\n");</p><p> return 0; }</p><p><b&
39、gt; else</b></p><p> return s.stack[s.top];</p><p><b> }</b></p><p> elmtype f(char c)</p><p> { switch(c)</p><p> {case '+'
40、;: return 0;</p><p> case '-': return 1;</p><p> case '*': return 2;</p><p> case '/': return 3;</p><p> case '(':
41、return 4;</p><p> case ')': return 5;</p><p> default: return 6; } </p><p><b> }</b></p><p> char Compare(char c1,char c2)</p>
42、<p> {int i1=f(c1);</p><p> int i2=f(c2);</p><p> if(f1[i1]>f2[i2])</p><p> return '>';</p><p> else if(f1[i1]<f2[i2])</p><p>
43、 return '<';</p><p><b> else</b></p><p> return '=';</p><p><b> }</b></p><p> int Operate(elmtype a,elmtype t,elmtype b)&
44、lt;/p><p><b> {int sum;</b></p><p><b> switch(t)</b></p><p> {case 0: sum=a+b; break;</p><p> case 1: sum=a-b; break;</p><p>
45、 case 2: sum=a*b; break;</p><p> default: sum=a/b;}</p><p> return sum;</p><p><b> }</b></p><p> float compvalue(char *postexp) </p><p>
46、<b> { </b></p><p><b> struct </b></p><p><b> { </b></p><p> float data[MaxSize]; </p><p><b> int top; </b></p>
47、;<p><b> } st; </b></p><p> EvaluateExpression()</p><p><b> {</b></p><p><b> char c;</b></p><p> int i=0,sum=0;</p>
48、;<p> int k=1,j=1;</p><p> elmtype x,t,a,b;</p><p> sqstack OPTR,OPND;</p><p> Initstack(&OPTR);</p><p> Push(&OPTR,f('#'));</p><
49、p> Initstack(&OPND);</p><p> c=getchar();</p><p> while(c!='#'||ch[Gettop(OPTR)]!='#')</p><p><b> {</b></p><p> if(isdigit(c))&l
50、t;/p><p><b> {</b></p><p><b> sum=0;</b></p><p> while(isdigit(c))</p><p><b> {</b></p><p><b> if(!j)</b>
51、</p><p> { sum=sum*10-(c-'0'); }</p><p><b> else</b></p><p> sum=sum*10+(c-'0');</p><p> c=getchar();}</p><p> Push(&O
52、PND,sum);</p><p><b> j=1;}</b></p><p><b> else</b></p><p><b> if(k)</b></p><p><b> {</b></p><p> switc
53、h(Compare(ch[Gettop(OPTR)],c))</p><p> { case'<': Push(&OPTR,f(c));</p><p> c=getchar();break;</p><p> case'=': Pop(&OPTR,&x);</p><p>
54、; c=getchar(); break;</p><p> case'>': Pop(&OPTR,&t);</p><p> Pop(&OPND,&b);</p><p> Pop(&OPND,&a);</p><p> Push(&OPND,Opera
55、te(a,t,b));</p><p> printf("\n");</p><p><b> break;} </b></p><p> return(Gettop(OPND));</p><p><b> }</b></p><p><b
56、> main()</b></p><p> { int result;</p><p> textcolor(GREEN);</p><p> cprintf("***************WELCOME **************n\r");</p><p> cprintf(&quo
57、t;*Input arithmetic expression (end with '#')*\n\r");</p><p> cprintf("*****************************************\n\r");</p><p> cprintf("*
58、 *\n\r");</p><p> result=EvaluateExpression();</p><p> textcolor(RED);</p><p> cprintf("*THE RESULT IS: %d \n\r",result);</p><
59、;p> textcolor(GREEN);</p><p> cprintf("* *\n\r");</p><p> cprintf("*************Thanks for using************* \n\r");</p>&l
60、t;p> cprintf("* *\n\r");</p><p> cprintf("* Instructor : Chen Zhi *\n\r");</p><p> cprintf("* Designers :
61、Chen Chunlin *\n\r");</p><p> cprintf("* Number : 0841330197 *\n\r");</p><p> cprintf("* School : ShaoYang University *\n\r")
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達(dá)式求值)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---算術(shù)表達(dá)式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值—mfc圖形界面
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)帶括號(hào)的算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(二)表達(dá)式求值(計(jì)算器)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)
- 算術(shù)表達(dá)式求值課程設(shè)計(jì)
- (鹽城工學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))棧的應(yīng)用表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告(逆波蘭表達(dá)式求值)
- 算術(shù)表達(dá)式求值演示-課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論