資源描述:
《軟件技術(shù)基礎(chǔ)小論文》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、《數(shù)據(jù)結(jié)構(gòu)》課程論文報(bào)告書題目:表達(dá)式求值系另0:學(xué)號(hào):學(xué)生姓名:目錄—1=4A2.概要設(shè)計(jì)2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)2.2算法設(shè)計(jì)2.3ADT描述2.4功能模塊分析A3.詳細(xì)設(shè)計(jì)3.1數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)3.2主要算法流程圖(或算法代碼)A4.軟件測(cè)試A5.總結(jié)1.前在計(jì)算機(jī)中,算術(shù)表達(dá)式山常量、變量、運(yùn)算符和括號(hào)組成。山于不同的運(yùn)算符具有不同的優(yōu)先級(jí),又耍考慮括號(hào),因此,算術(shù)表達(dá)式的求值不對(duì)能嚴(yán)格地從左到右進(jìn)行。因而在程序設(shè)計(jì)時(shí),借助棧實(shí)現(xiàn)。算法輸入:一個(gè)算術(shù)表達(dá)式,由常量、變量、運(yùn)算符和括號(hào)組成(以字符串形式輸入)。為簡(jiǎn)化
2、,規(guī)定操作數(shù)只能為正整數(shù),操作符為+、-*、/,用#表示結(jié)朿。算法輸出:表達(dá)式運(yùn)算結(jié)果。算法耍點(diǎn):設(shè)置運(yùn)算符棧和運(yùn)算數(shù)棧輔助分析算符優(yōu)先關(guān)系。在讀入表達(dá)式的字符序列的同時(shí),完成運(yùn)算符和運(yùn)算數(shù)的識(shí)別處理,以及相應(yīng)運(yùn)算。2.概要設(shè)計(jì)2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)任何一個(gè)表達(dá)式都是山操作符,運(yùn)算符和界限符組成的。我們分別用順序棧來(lái)寄存衣達(dá)式的操作數(shù)和運(yùn)算符。棧是限定于緊僅在表尾進(jìn)行插入或刪除操作的線性表。順序棧的存儲(chǔ)結(jié)構(gòu)是利用一?紐連續(xù)的存儲(chǔ)單元依次存放自棧底到棧頂?shù)臄?shù)據(jù)元索,同時(shí)附設(shè)指針top指示棧頂元素在順序棧中的位置,base為
3、棧底指針,在順序棧中,它始終指向棧底,即top二base可作為??盏臉?biāo)記,每當(dāng)插入新的棧頂元索時(shí),指針top增1,刪除棧頂元索時(shí),指針top減1。2.2算法設(shè)計(jì)為了實(shí)現(xiàn)算符優(yōu)先算法??梢允褂脙蓚€(gè)工作棧。一個(gè)稱為0PTR,用以寄存運(yùn)算符,另一個(gè)稱做0PND,用以寄存操作數(shù)或運(yùn)算結(jié)果。1?首先置操作數(shù)棧為空棧,表達(dá)式起始符”#”為運(yùn)算符棧的棧底元素;2.依次讀入表達(dá)式,若是操作符即進(jìn)0PND棧,若是運(yùn)算符則和0PTR棧的棧頂運(yùn)算符比較優(yōu)先權(quán)后作相應(yīng)的操作,直至整個(gè)表達(dá)式求值完畢(即0PTR棧的棧頂元素和當(dāng)前讀入的字符均為
4、”#”)。2.3ADT描述ADTStack{數(shù)據(jù)對(duì)象:D={a-IEElemSet,i=l,2,???,n,nMO}數(shù)據(jù)對(duì)象:R1二{<%,%_]>
5、勺_],勺w£),i=2,…,n}約定a”端為棧頂,曾端為棧底?;静僮鳎篒nitStack(&S)操作結(jié)果:構(gòu)造一個(gè)空棧S。GetTop(S)初始條件:棧S己存在。操作結(jié)果:用P返回S的棧頂元素。Push(&S,ch)初始條件:棧S已存在。操作結(jié)果:插入元素ch為新的棧頂元素。Pop(&S)初始條件:棧S已存在。操作結(jié)果:刪除S的棧頂元素。In(ch)操作結(jié)果:判斷字
6、符是否是運(yùn)算符,運(yùn)算符即返冋1。Precede(cl,c2)初始條件:cl,c2為運(yùn)算符。操作結(jié)果:判斷運(yùn)算符優(yōu)先權(quán),返回優(yōu)先權(quán)窩的。Operate(a,op,b)初始條件:a,b為整數(shù),op為運(yùn)算符。操作結(jié)果:a與b進(jìn)行運(yùn)算,op為運(yùn)算符,返冋其值。num(n)操作結(jié)杲:返回操作數(shù)的長(zhǎng)度。EvalExpr()初始條件:輸入表達(dá)式合法。操作結(jié)果:返回表達(dá)式的最終結(jié)果。}ADTStack2.4功能模塊分析1.棧的棊本功能。InitStack(Stack*s)和InitStack2(Stack2*s)分別構(gòu)造運(yùn)算符棧與構(gòu)
7、造操作數(shù)棧,Push(Stack*s,charch)運(yùn)算符棧插入ch為新的棧頂元素,Push2(Stack2*s,intch)操作數(shù)棧插入ch為新的棧頂元素,Pop(Stack*s)刪除運(yùn)算符棧s的棧頂元素,川p返回其值,Pop2(Stack2*s)刪除操作數(shù)棧s的棧頂元素,用p返回其值,GetTop(Stacks)用p返回運(yùn)算符棧s的棧頂元素,GetTop2(Stack2s)用p返回操作數(shù)棧s的棧頂元素。1.其它功能分析。(l)Tn(charch)判斷字符是否是運(yùn)算符功能,運(yùn)算符即返回1,該功能只需簡(jiǎn)單的一條語(yǔ)句即
8、可實(shí)現(xiàn)return(ch二二'+'
9、
10、ch二二'-'
11、
12、ch二二'*'
13、
14、ch二二'/'
15、
16、ch二二'('
17、
18、ch二二')'
19、
20、ch二二'#')。(2)Precede(charcl,charc2)判斷運(yùn)算符優(yōu)先權(quán)功能,該函數(shù)判斷運(yùn)算符cl,c2的優(yōu)先權(quán),具休優(yōu)先關(guān)系參照表1。(3)Operate(inta,charop,intb)操作數(shù)用對(duì)應(yīng)的運(yùn)算符進(jìn)行運(yùn)算功能。運(yùn)算結(jié)果直接返冋。(4)nn)求操作數(shù)的長(zhǎng)度功能,需要用itoa函數(shù)把int型轉(zhuǎn)換成字符串型,strlen函數(shù)可求字符長(zhǎng)度。(5)EvalExpr()主要操
21、作函數(shù)運(yùn)算功能。分析詳細(xì)見“3?詳細(xì)設(shè)計(jì)…3.2”。2.1數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)因?yàn)楸磉_(dá)式是由操作符,運(yùn)算符和界限符組成的。如果只用一個(gè)char類型棧,不能滿足2位以上的整數(shù),所以還需要定義一個(gè)int類型的棧川來(lái)寄存操作數(shù)。/*定義字符類型棧*/typedefstruct{intstacksize;char*base;char*top;}Stack;