

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p> 選題名稱: 表達(dá)式翻譯 </p><p> 系(院): 計(jì)算機(jī)工程系</p><p> 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 班 級(jí):
2、 </p><p> 姓 名: 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 學(xué)年學(xué)期: ~ 學(xué)年 第 學(xué)期</p><p> 年 月 日</p
3、><p><b> 設(shè)計(jì)任務(wù)書</b></p><p><b> 注意:</b></p><p> 任務(wù)書格式參照“任務(wù)書范例”執(zhí)行。</p><p> 范例中的紅色文字應(yīng)根據(jù)你所選擇的具體課題,修改為對(duì)應(yīng)的內(nèi)容。</p><p> 范例中的其它內(nèi)容不變。</p&
4、gt;<p><b> 摘要:</b></p><p> 后綴表達(dá)式被廣泛應(yīng)用于編譯原理中,原因是后綴表達(dá)式有一個(gè)其他的算法不能比擬的優(yōu)點(diǎn)——拆括號(hào)。標(biāo)準(zhǔn)的表達(dá)式如“A+B”,在數(shù)學(xué)上學(xué)名叫中綴表達(dá)式,原因是運(yùn)算符號(hào)在兩個(gè)運(yùn)算對(duì)象的中間。相對(duì)應(yīng)的還有前綴表達(dá)式,如:“+ - A * B C D”,轉(zhuǎn)換成中綴表達(dá)式為:“A - B * C + D”;后綴表達(dá)式,比如前所述的中
5、綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式為:“A B C * - D +”。后綴表達(dá)式的優(yōu)點(diǎn)是顯而易見的,編譯器在處理時(shí)候按照從左至右的順序讀取后綴表達(dá)式,遇到運(yùn)算對(duì)象直接壓入堆棧,遇到運(yùn)算符就從堆棧提取后進(jìn)的兩個(gè)對(duì)象進(jìn)行計(jì)算,這個(gè)過程正好符合了計(jì)算機(jī)計(jì)算的原理。后綴表達(dá)式比前綴表達(dá)式更加易于轉(zhuǎn)換,并且它的最左面一定為數(shù)字,這一點(diǎn)在實(shí)際編程的時(shí)候就會(huì)體會(huì)到它的好處了。后綴表達(dá)式有一個(gè)更大的優(yōu)點(diǎn),就是拆括號(hào),根據(jù)運(yùn)算符的級(jí)別將中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式后
6、,運(yùn)算順序就已經(jīng)替代了運(yùn)算符的級(jí)別,這樣也避免了括號(hào)提高運(yùn)算級(jí)別的特殊處理。</p><p> 關(guān)鍵字:順序棧;優(yōu)先級(jí);中綴表達(dá)式;后綴表達(dá)式</p><p><b> 目 錄</b></p><p><b> 1 需求分析1</b></p><p> 1.1 任務(wù)要求1</p&
7、gt;<p> 1.2 課程設(shè)計(jì)思想1</p><p> 1.3 運(yùn)行環(huán)境1</p><p><b> 2 概要設(shè)計(jì)1</b></p><p> 2.1 總體功能結(jié)構(gòu)1</p><p> 2.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)2</p><p> 2.3 程序原理2</p
8、><p> 3 詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)3</p><p> 3.1 模塊功能3</p><p> 3.2 算法原理4</p><p> 3.3 流程圖12</p><p> 4 調(diào)試與操作說明12</p><p><b> 總 結(jié)15</b></p>
9、;<p><b> 致 謝16</b></p><p> 參 考 文 獻(xiàn)17</p><p><b> 指導(dǎo)教師評(píng)語18</b></p><p><b> 1 需求分析</b></p><p><b> 1.1 任務(wù)要求</b&g
10、t;</p><p> 本次的課程設(shè)計(jì)實(shí)踐周,我做的課題是表達(dá)式翻譯。此次課程設(shè)計(jì)的任務(wù)是收集一些有關(guān)中綴表達(dá)式翻譯成后綴表達(dá)式知識(shí)的資料,還有括號(hào)匹配方面的資料。編寫完整程序,將中綴表達(dá)式翻譯成后綴表達(dá)式。認(rèn)真主動(dòng)完成課程設(shè)計(jì)的要求。有問題及時(shí)主動(dòng)通過各種方式與教師聯(lián)系溝通。學(xué)生要發(fā)揮自主學(xué)習(xí)的能力,充分利用時(shí)間,安排好課程設(shè)計(jì)的時(shí)間計(jì)劃,設(shè)計(jì)程序并調(diào)試。在課程設(shè)計(jì)周,主要是進(jìn)行課程設(shè)計(jì)的答辯工作,期間也繼續(xù)
11、進(jìn)行的調(diào)試與完善工作,上機(jī)時(shí)數(shù)通常為12~15小時(shí),參加答辯。</p><p> 1.2 課程設(shè)計(jì)思想</p><p> 一般來說,課程設(shè)計(jì)要比教學(xué)實(shí)驗(yàn)復(fù)雜一些,涉及的深度廣些,而且更加實(shí)用一些。其主要目的是通過課程設(shè)計(jì)的綜合訓(xùn)練,培養(yǎng)學(xué)生分析解決實(shí)際問題和編程等實(shí)際動(dòng)手能力,最終目標(biāo)是想通過這種形式,幫助學(xué)生系統(tǒng)掌握數(shù)據(jù)結(jié)構(gòu)這門課程的主要內(nèi)容,使老師更好的完成教學(xué)任務(wù)。數(shù)據(jù)結(jié)構(gòu)是一門
12、涉及多門課程的課程,難度較大,需要較好的C/C++語言的程序設(shè)計(jì)和調(diào)試能力,如果學(xué)生能夠按照要求,從時(shí)間和精力上保證完全的投入,相信能夠有很大的收獲,幾分投入幾分收獲。</p><p><b> 1.3 運(yùn)行環(huán)境</b></p><p> Windows2000以上操作系統(tǒng)、Visual C++6.0以上編譯環(huán)境。</p><p><
13、b> 2 概要設(shè)計(jì)</b></p><p> 2.1 總體功能結(jié)構(gòu)</p><p> 編寫一個(gè)完整的程序,將中綴表達(dá)式翻譯成后綴表達(dá)式。表達(dá)式由操作數(shù)(變量)、操作(運(yùn)算符)以及小括弧“(”和“)”組成,其中:操作包括算術(shù)運(yùn)算、關(guān)系運(yùn)算和邏輯運(yùn)算三類;操作數(shù)應(yīng)能夠識(shí)別但個(gè)字符或由字母和數(shù)字任意多個(gè)字符構(gòu)成;能夠識(shí)別出簡(jiǎn)單的錯(cuò)誤,如括弧不匹配。</p>
14、<p> 設(shè)計(jì)一個(gè)順序棧類SeqStack,作為程序的頭文件SeqStack.h。再設(shè)計(jì)四個(gè)函數(shù):棧內(nèi)優(yōu)先級(jí)函數(shù)isp(),棧外優(yōu)先級(jí)函數(shù)icp(),表達(dá)式檢查函數(shù)ExpIsCorrect()和表達(dá)式轉(zhuǎn)換函數(shù)postfix()。</p><p> 2.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</p><p> 利用一個(gè)順序??梢詫?shí)現(xiàn)將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,也能實(shí)現(xiàn)對(duì)括號(hào)是否匹配進(jìn)行檢測(cè)。用一
15、個(gè)字符型數(shù)組存放從鍵盤輸入的中綴表達(dá)式,經(jīng)運(yùn)行后由屏幕輸出轉(zhuǎn)化后的后綴表達(dá)式。</p><p><b> 2.3 程序原理</b></p><p> 棧(stack)是最常用和最重要的數(shù)據(jù)結(jié)構(gòu)。局部變量是放在棧中的,表達(dá)式的優(yōu)先級(jí)處理也是基于棧來實(shí)現(xiàn)的,函數(shù)調(diào)用時(shí)的參數(shù)傳遞和函數(shù)值的返回都是由棧來實(shí)現(xiàn)的。棧是限制在表的一端進(jìn)行插入和刪除的線性表(即一維數(shù)組)。允許
16、插入刪除的一端為棧頂,另一固定端為棧底。當(dāng)表中沒有元素時(shí)稱為空棧。如圖2-1所示,棧中有三個(gè)元素,進(jìn)棧的順序是a、b、c,當(dāng)需要出棧時(shí)其順序?yàn)閏、b、a。所以棧又稱為后進(jìn)先出的線性表(Last In First Out),簡(jiǎn)稱LIFO表。</p><p> 在日常生活中,有很多后進(jìn)先出的例子。在程序設(shè)計(jì)中,常常需要使得與保存數(shù)據(jù)時(shí)相反順序來使用這些數(shù)據(jù),這時(shí)就需要用一個(gè)棧來實(shí)現(xiàn)。</p><
17、p> 對(duì)于棧,常做的基本運(yùn)算有:</p><p> (1)棧初始化:Init_Stack(s)</p><p> 初始條件:棧s不存在</p><p> 操作結(jié)果:構(gòu)造了一個(gè)空棧。</p><p> (2)判斷??眨篍mpty_Stack(s)</p><p> 初始條件:棧s已存在</p>
18、;<p> 操作結(jié)果:若棧s為空棧返回為1,否則返回為0.</p><p> (3)入棧:Push_Stack(s,x)</p><p> 初始條件:棧s已存在</p><p> 操作結(jié)果:在棧s的頂部插入一個(gè)新元素x,x成為新的棧頂元素。棧發(fā)生變化。</p><p> (4)出棧:Pop_Stack(s)</p
19、><p> 初始條件:棧s存在且非空</p><p> 操作結(jié)果:棧s的頂部元素從棧中刪除,棧中少了一個(gè)元素。棧發(fā)生變化。</p><p> ?。?)讀棧頂元素:Top_Stack(s)</p><p> 初始條件:棧s存在且非空</p><p> 操作結(jié)果:棧頂元素作為結(jié)果返回,棧不變化。</p>
20、<p> 棧可以用順序表實(shí)現(xiàn),稱為順序棧;也可以用鏈表實(shí)現(xiàn),稱為鏈棧。順序棧和鏈棧的邏輯功能一樣。順序棧必須先開一定大小的內(nèi)存空間,執(zhí)行起來簡(jiǎn)單并且速度快,但可能溢出;鏈棧的內(nèi)存空間隨用隨開,不會(huì)溢出;但執(zhí)行復(fù)雜(不斷地動(dòng)態(tài)分配)且速度慢。</p><p><b> 3 詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)</b></p><p><b> 3.1 模塊功能<
21、;/b></p><p> 定義一個(gè)順序棧類SeqStack,首先構(gòu)造一個(gè)空棧,包含的操作有進(jìn)棧Push(),出棧Pop(),取棧頂元素GetTop(),判??辗馧otEmpty()。利用這個(gè)順序棧對(duì)中綴表達(dá)式進(jìn)行檢測(cè),若出錯(cuò)(主要為括號(hào)比匹配),給出出錯(cuò)提示;否則,將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式。</p><p> 表達(dá)式檢測(cè)函數(shù)ExpIsCorrect(),實(shí)現(xiàn)對(duì)表達(dá)式中的括號(hào)
22、進(jìn)行匹配檢驗(yàn)。算術(shù)表達(dá)式中右括號(hào)和左括號(hào)匹配的次序正好符合后到括號(hào)要最先被匹配的“后進(jìn)先出”棧操作特點(diǎn),因此可以借助一個(gè)棧來進(jìn)行判斷。</p><p> 表達(dá)式轉(zhuǎn)換函數(shù)postfix(),當(dāng)表達(dá)式正確時(shí),利用此函數(shù)將中綴表達(dá)式轉(zhuǎn)換成對(duì)應(yīng)的后綴表達(dá)式。將中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式過程中,要注意的是“(”無論入棧中級(jí)別為何,直接入棧,在遇到“)”時(shí)候,找到最后進(jìn)入的“(”,并把“(”前面所有的符號(hào)都?jí)喝氤鰲!?lt
23、;/p><p> 由于在表達(dá)式轉(zhuǎn)換過程中,需要比較新讀入元素與當(dāng)前棧頂元素的優(yōu)先級(jí),所以,需要定義兩個(gè)優(yōu)先級(jí)函數(shù):棧外優(yōu)先級(jí)函數(shù)icp()和棧內(nèi)優(yōu)先級(jí)函數(shù)isp()。</p><p><b> 3.2 算法原理</b></p><p> 棧的抽象數(shù)據(jù)類型有兩種典型的存儲(chǔ)表示:基于數(shù)組的存儲(chǔ)表示和基于鏈表的存儲(chǔ)表示?;跀?shù)組的存儲(chǔ)表示實(shí)現(xiàn)的棧稱
24、為順序棧,基于鏈表的存儲(chǔ)表示實(shí)現(xiàn)的棧稱為鏈棧。</p><p> 順序??梢圆捎庙樞虮碜鳛槠浯鎯?chǔ)表示,為此,可以在順序棧的聲明中用順序表定義它的存儲(chǔ)空間。本次課程設(shè)計(jì)中,實(shí)用一維數(shù)組作為棧的存儲(chǔ)空間。存放棧元素的數(shù)組的頭指針為*s,該數(shù)組的最大允許存放元素個(gè)數(shù)為maxsize,當(dāng)前棧頂位置由數(shù)組下標(biāo)指針top指示。如果棧不空時(shí),s[0]是棧中第一個(gè)元素。</p><p><b>
25、; 順序棧的類定義</b></p><p> class SeqStack</p><p><b> {</b></p><p><b> public:</b></p><p> SeqStack(){top=0;}; //構(gòu)造一個(gè)空棧</p><p&g
26、t; ~SeqStack(){}</p><p> void Push(const char x);</p><p> char Pop();</p><p> char GetTop()const;</p><p> bool NotEmpty()const </p><p> {return(top!=
27、0);}</p><p><b> private:</b></p><p> char s[maxsize];</p><p><b> int top;</b></p><p><b> };</b></p><p> top指示的是最后加
28、入的元素的存儲(chǔ)位置。在實(shí)現(xiàn)進(jìn)棧操作時(shí),應(yīng)先判斷棧是否已滿。棧的最后允許存放位置為maxsize,如果棧頂指針top==maxsize,則說明棧中所有位置均已使用,棧已滿。這時(shí)若再有新元素進(jìn)棧,將發(fā)生溢出,程序轉(zhuǎn)入溢出處理。如果top<maxsize,則先讓棧頂指針進(jìn)1,指到當(dāng)前可加入新元素的位置,再按棧頂指針?biāo)肝恢脤⑿略夭迦?。這個(gè)新插入的元素將成為新的棧頂元素。</p><p> 另一個(gè)極端情況出現(xiàn)在
29、棧底:如果在退棧時(shí)發(fā)現(xiàn)是空棧,即top==0,則退棧操作將執(zhí)行棧空處理。??仗幚硪话悴皇浅鲥e(cuò)處理,而是使用這個(gè)棧的算法結(jié)束時(shí)需要執(zhí)行的處理。若當(dāng)前top≥0,則可將棧頂指針減1,等于棧頂退回到次棧頂位置。</p><p><b> 棧的成員函數(shù)的實(shí)現(xiàn)</b></p><p> void SeqStack::Push(const char x)</p>
30、<p><b> {</b></p><p> if(top==maxsize)</p><p><b> {</b></p><p> cout<<"棧已滿"<<endl;</p><p><b> exit(0);<
31、;/b></p><p><b> }</b></p><p> s[top]=x; //先存儲(chǔ)x</p><p> top++; //然后top加1</p><p><b> }</b></p><p> char SeqStack::Pop()<
32、/p><p><b> {</b></p><p> if(top==0)</p><p><b> {</b></p><p> cout<<"棧已空"<<endl;</p><p><b> exit(0);&l
33、t;/b></p><p><b> }</b></p><p> top--; //top先減1</p><p> return s[top]; //然后去元素返回</p><p><b> }</b></p><p> char SeqStack::G
34、etTop()const //取棧頂數(shù)據(jù)元素</p><p><b> {</b></p><p> if(top==0)</p><p><b> {</b></p><p> cout<<"棧已空"<<endl;</p><
35、;p><b> exit(0);</b></p><p><b> }</b></p><p> return s[top-1]; //返回當(dāng)前棧頂元素</p><p><b> }</b></p><p> 舉例說明,在一個(gè)字符串“(a*(b+c)-d)”中
36、位置1和位置4有左括號(hào)“(”,位置8和位置11有右括號(hào)“)”。位置1的左括號(hào)匹配位置11的右括號(hào),位置4的左括號(hào)匹配位置8的右括號(hào)。而對(duì)于字符串“(a+b))(”,位置6的右括號(hào)沒有可匹配的左括號(hào),位置7的左括號(hào)沒有可匹配的右括號(hào)。</p><p> 我們的目的是建立一個(gè)算法,輸入一個(gè)字符串,輸出括號(hào)匹配的信息。</p><p> 算法思想:算術(shù)表達(dá)式中右括號(hào)和左括號(hào)匹配的次序正好符合
37、后到括號(hào)要最先被匹配的“后進(jìn)先出”棧操作特點(diǎn),因此可以借助一個(gè)棧來進(jìn)行判斷。</p><p> 括號(hào)匹配共有四種情況:</p><p> 左、右括號(hào)配對(duì)次序不正確;</p><p><b> 右括號(hào)多于左括號(hào);</b></p><p><b> 左括號(hào)多于右括號(hào);</b></p>
38、<p> 左、右括號(hào)匹配正確。</p><p> 具體方法是:順序掃描算術(shù)表達(dá)式(表現(xiàn)為一個(gè)字符串),當(dāng)遇到三種類型的左括號(hào)時(shí),讓該括號(hào)進(jìn)棧;當(dāng)掃描到某一種類型的右括號(hào)時(shí),比較當(dāng)前棧頂括號(hào)是否與之匹配,若匹配,則退棧,繼續(xù)進(jìn)行判斷;若當(dāng)前棧頂括號(hào)與當(dāng)前掃描的括號(hào)不相同,則左、右括號(hào)配對(duì)次序不正確;若字符串當(dāng)前為某種類型左括號(hào)而棧已空,則右括號(hào)多于左括號(hào);字符串循環(huán)掃描結(jié)束時(shí),若棧非空(即粘中尚有
39、某種類型左括號(hào)),則說明左括號(hào)多于右括號(hào);否則,左、右括號(hào)匹配正確。</p><p><b> 函數(shù)設(shè)計(jì)如下:</b></p><p> void ExpIsCorrect(char exp[],int n) //判斷有n個(gè)字符串exp左、右括號(hào)是否//配對(duì)正確</p><p><b> {</b></p&g
40、t;<p> SeqStack myStack; //定義順序棧類對(duì)象myStack</p><p><b> int i;</b></p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> if(exp[i]==
41、39;(')</p><p> myStack.Push(exp[i]); //入棧</p><p> else if(exp[i]==')'&&myStack.NotEmpty()&&myStack.GetTop()=='(')</p><p> myStack.Pop(); //出
42、棧</p><p> else if(exp[i]==')'&&myStack.NotEmpty()&&myStack.GetTop()!='(')</p><p><b> {</b></p><p> cout<<"左右括號(hào)配對(duì)次序不正確!請(qǐng)檢查表達(dá)
43、式"<<endl;</p><p><b> return;</b></p><p><b> }</b></p><p> else if((exp[i]==')')&&!myStack.NotEmpty())</p><p><b
44、> {</b></p><p> cout<<"右括號(hào)多于左括號(hào)!請(qǐng)檢查表達(dá)式"<<endl;</p><p><b> return;</b></p><p><b> }</b></p><p><b> }<
45、;/b></p><p> if(myStack.NotEmpty())</p><p> cout<<"左括號(hào)多于右括號(hào)!請(qǐng)檢查表達(dá)式"<<endl;</p><p><b> else</b></p><p><b> {</b><
46、/p><p> cout<<"表達(dá)式正確,請(qǐng)?jiān)佥斎肷鲜剑ㄒ?結(jié)束)"<<endl;</p><p> postfix();</p><p><b> }</b></p><p><b> }</b></p><p> 使用???/p>
47、將表達(dá)式的中綴表示轉(zhuǎn)換成它的前綴表示和后綴表示。本次課程設(shè)計(jì)討論的是比較實(shí)用的將中綴表示轉(zhuǎn)換為后綴表示的方法。</p><p> 在中綴表達(dá)式中操作符的優(yōu)先級(jí)和括號(hào)使得求職過程復(fù)雜化,把它轉(zhuǎn)換成后綴表達(dá)式,可簡(jiǎn)化求值過程。為了實(shí)現(xiàn)這種轉(zhuǎn)換,需要考慮各操作符的優(yōu)先級(jí),參看表3-1。</p><p> 表3-1 各個(gè)算術(shù)操作符的優(yōu)先級(jí)</p><p> isp叫做
48、棧內(nèi)(in stack priority)優(yōu)先數(shù),icp叫做棧外(in coming priority)優(yōu)先數(shù)。從表32中可以看到,左括號(hào)的棧外優(yōu)先數(shù)最高,它一來到立即進(jìn)棧,但當(dāng)它進(jìn)入棧中后,其棧內(nèi)優(yōu)先數(shù)變得極低,以便括號(hào)內(nèi)的其他操作符進(jìn)棧。其他操作符進(jìn)入棧中后優(yōu)先數(shù)都升1,這樣可體現(xiàn)在中綴表達(dá)式中相同優(yōu)先級(jí)的操作符自左向右計(jì)算的要求,讓位于棧頂?shù)牟僮鞣韧藯2⑤敵?。操作符?yōu)先數(shù)相等的情況只出現(xiàn)在括號(hào)配對(duì)或棧底的“#”號(hào)與輸入流最后的’
49、#’號(hào)配對(duì)時(shí)。前者將連續(xù)退出位于棧頂?shù)牟僮鞣钡接龅健ā癁橹埂H缓髮ⅰ埃ā蓖藯R詫?duì)消括號(hào),后者將結(jié)束算法。</p><p> 掃描中綴表達(dá)式,將它轉(zhuǎn)換為后綴表達(dá)式的算法描述如下:</p><p> ?、贄3跏蓟?,將結(jié)束符#進(jìn)棧。然后讀入中綴表達(dá)式字符流的首字符ch。</p><p> ②重復(fù)執(zhí)行以下步驟,直到ch=‘#’,同時(shí)棧頂?shù)牟僮鞣彩恰?’,停止循環(huán)
50、。</p><p> 若ch是操作數(shù)直接輸出,讀入下一個(gè)字符ch。</p><p> 若ch是操作符,判斷ch 的棧外優(yōu)先級(jí)icp和當(dāng)前位于棧頂?shù)牟僮鞣鹢p的棧內(nèi)優(yōu)先級(jí)isp:</p><p> ·若icp(ch)>isp(op),令ch進(jìn)棧,讀入下一個(gè) 字符ch。</p><p> ·若icp(
51、ch)<isp(op),退棧并輸出。</p><p> ·若icp(ch)=isp(op),退棧但不輸出,若退出的是‘(’號(hào)讀入下一個(gè)字符ch。</p><p> ?、鬯惴ńY(jié)束,輸出序列即為所需的后綴表達(dá)式。</p><p> 例如,給定中綴表達(dá)式為A+B*(C-D)-E/F,應(yīng)當(dāng)轉(zhuǎn)換成ABCD-*+EF/-,按上述算法應(yīng)執(zhí)行的轉(zhuǎn)換過程(包括棧的
52、變化和輸出)如圖3-1所示。</p><p> 圖3-1 利用棧的轉(zhuǎn)換過程</p><p> 中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式的算法</p><p> void postfix()</p><p> { //把中綴表示轉(zhuǎn)換成后綴表示并輸出之</p><p> SeqStack s; //定義棧的對(duì)象s</
53、p><p> char ch='#';</p><p> s.Push(ch); //棧底放了一個(gè)‘#’</p><p> cin.get(ch); //讀入一個(gè)字符</p><p> while(s.NotEmpty()==true&&ch!='#') //連續(xù)處理</p>
54、;<p><b> {</b></p><p> if(isdigit(ch)) //是操作數(shù),輸出之</p><p><b> {</b></p><p> cout<<ch<<" ";</p><p> cin.get(ch)
55、;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(isp(s.GetTop())<icp(ch)) //新輸入操作符ch優(yōu)先級(jí)高</p><p&
56、gt;<b> {</b></p><p> s.Push(ch); //進(jìn)棧</p><p> cin.get(ch); //讀入下一字符</p><p><b> }</b></p><p> else if(isp(s.GetTop())>icp(ch)) //新輸入操作
57、符優(yōu)先級(jí)低</p><p><b> {</b></p><p> cout<<s.Pop()<<" "; //退棧并輸出</p><p><b> }</b></p><p><b> else</b></p>
58、<p><b> {</b></p><p> if(s.Pop()=='(')</p><p> cin.get(ch);</p><p><b> }</b></p><p><b> }</b></p><p&g
59、t;<b> }</b></p><p> cout<<s.Pop();</p><p> cout<<endl;</p><p><b> }</b></p><p> 該算法對(duì)輸入表達(dá)式只進(jìn)行一次自左向右的掃描,對(duì)每個(gè)操作數(shù)只執(zhí)行一次輸出,其執(zhí)行時(shí)間為O(1)。
60、對(duì)每一個(gè)操作符,執(zhí)行進(jìn)棧和退棧各一次,其時(shí)間也為O(1)。若設(shè)表達(dá)式中符號(hào)的總數(shù)為n,則總的執(zhí)行時(shí)間復(fù)雜度為O(n)。</p><p><b> 棧內(nèi)優(yōu)先級(jí)算法</b></p><p> int isp(char x) //棧內(nèi)優(yōu)先級(jí)</p><p><b> {</b></p><p>&
61、lt;b> switch(x)</b></p><p><b> {</b></p><p> case'#':return 0;break;</p><p> case'(':return 1;break;</p><p> case'/':c
62、ase'*':return 5;break;</p><p> case'+':case'-':return 3;break;</p><p> case')':return 6;break;</p><p><b> }</b></p><p>&l
63、t;b> }</b></p><p><b> 棧外優(yōu)先級(jí)算法</b></p><p> int icp(char x) //棧外優(yōu)先級(jí)</p><p><b> {</b></p><p><b> switch(x)</b></p>
64、<p><b> {</b></p><p> case'#':return 0;break;</p><p> case'(':return 6;break;</p><p> case'/':case'*':return 4;break;</p>
65、;<p> case'+':case'-':return 2;break;</p><p> case')':return 1;break;</p><p><b> }</b></p><p><b> }</b></p><p&g
66、t;<b> 3.3 流程圖</b></p><p><b> 圖3-2</b></p><p><b> 4 調(diào)試與操作說明</b></p><p> 運(yùn)行后的初始界面如圖4-1所示</p><p><b> 圖4-1</b></p>
67、;<p> 若表達(dá)式正確,如輸入9-(2+4*7)/5+3,按下回車鍵,結(jié)果如圖4-2所示</p><p><b> 圖4-2</b></p><p> 此時(shí)表達(dá)式已被檢測(cè)為正確,則將它轉(zhuǎn)換成后綴表達(dá)式,結(jié)果如圖4-3所示</p><p><b> 圖4-3</b></p><p&
68、gt; 輸入n,不結(jié)束,在輸入一個(gè)錯(cuò)誤的中綴表達(dá)式,如圖4-4所示</p><p><b> 圖4-4</b></p><p><b> 總 結(jié)</b></p><p><b> 致 謝</b></p><p><b> 參 考 文 獻(xiàn)</b>
69、;</p><p> 1 殷人昆,陶永雷等編著.數(shù)據(jù)結(jié)構(gòu)——用面向?qū)ο蠓椒ㄅcC++語言描述.北京:清華大學(xué)出版社,1997</p><p> 2 徐孝凱編著.數(shù)據(jù)結(jié)構(gòu)實(shí)用教程(C/C++描述).北京:清華大學(xué)出版社,1999</p><p> 3 朱站立編.數(shù)據(jù)結(jié)構(gòu)——使用C++語言.先西安:西安電子科技大學(xué)出版社,2001</p><p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 算術(shù)表達(dá)式求值課程設(shè)計(jì)
- c++課程設(shè)計(jì)---中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的實(shí)現(xiàn)
- vc++課程設(shè)計(jì)《算術(shù)表達(dá)式》
- 算術(shù)表達(dá)式的計(jì)算課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)
- 課程設(shè)計(jì)報(bào)告-表達(dá)式類型的實(shí)現(xiàn)
- 利用棧求表達(dá)式課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達(dá)式求值)課程設(shè)計(jì)
- 算術(shù)表達(dá)式求值演示-課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--表達(dá)式求值
- 算數(shù)表達(dá)式的求解課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---中綴算術(shù)表達(dá)式求值
評(píng)論
0/150
提交評(píng)論