

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p> 利用線性表進(jìn)行算式計(jì)算</p><p><b> 一:問題描述:</b></p><p> 在計(jì)算機(jī)中,算術(shù)表達(dá)式由常量、變量、運(yùn)算符號和括號組成,由于不同的運(yùn)算符具有不同的優(yōu)先級,又要考慮到括號,因此,算術(shù)表達(dá)式的求值不可能嚴(yán)格地從左往右進(jìn)行,因而在程序設(shè)計(jì)時(shí),借助棧實(shí)現(xiàn)。&
2、lt;/p><p> 算法要點(diǎn):設(shè)置運(yùn)算符棧和運(yùn)算數(shù)隊(duì)列輔助分析算符優(yōu)先關(guān)系,在讀入表達(dá)式的字符序列的同時(shí),完成運(yùn)算符和運(yùn)算數(shù)的識別處理,以及相應(yīng)運(yùn)算。</p><p><b> 二:需求分析</b></p><p> 1、輸入的形式和輸入值的范圍</p><p> 一個(gè)算術(shù)表達(dá)式,由常量、變量、運(yùn)算符和括號組成(以
3、字符串的形式輸入)。為簡化,規(guī)定操作數(shù)只能為整數(shù),操作符為“+”、“-”、“*”、“/”、“%”,用“#”開始且用“#”結(jié)束,優(yōu)先級為:括號--%--*,/--+,-。</p><p><b> 2、輸出的形式</b></p><p> 即輸出表達(dá)式運(yùn)算結(jié)果,本算法中輸出的形式為The end is:.....</p><p> 3、程序
4、所能達(dá)到的功能</p><p> 界面上出現(xiàn)一個(gè)文本框,輸入一個(gè)表達(dá)式(以“#”開始并以“#”結(jié)束,此表達(dá)式包括“+”、“-”、“*”、“/”、“%”、括號以及整數(shù)),點(diǎn)擊回車,顯示結(jié)果。</p><p><b> 4、測試結(jié)果</b></p><p> 正確的輸入一個(gè)表達(dá)式是指輸入一個(gè)正確的表達(dá)式即不能連續(xù)輸入兩個(gè)運(yùn)算符(括號除外),切
5、以“#”開始以“#”結(jié)束,點(diǎn)擊回車界面上出現(xiàn)The end is:……即此表達(dá)式的結(jié)果。</p><p> 輸入表達(dá)式錯(cuò)誤有兩種形式:</p><p> ?。?)、所輸入的表達(dá)式未以“#”開始則點(diǎn)擊回車,系統(tǒng)會(huì)提示“RROE!Please begin with "#“,“且下面輸出”Continue?(y/n):“,若輸入Y或者y,則再次進(jìn)入主界面輸入表達(dá)式,若輸入N或者n,則
6、跳出系統(tǒng)。</p><p> ?。?)、所輸入的表達(dá)式錯(cuò)誤,即連續(xù)輸入兩個(gè)運(yùn)算符,此時(shí)系統(tǒng)會(huì)提示“ERROE!Please input another time!“,</p><p><b> 三:概要設(shè)計(jì) </b></p><p><b> 主程序的流程圖為</b></p><p><
7、;b> 四:詳細(xì)設(shè)計(jì)</b></p><p> 1、本系統(tǒng)中所用到的抽象數(shù)據(jù)類型有棧的抽象數(shù)據(jù)類型以及隊(duì)列的抽象數(shù)據(jù)類型。</p><p> 棧的抽象數(shù)據(jù)類型定義:</p><p> ADT Stack{</p><p> 數(shù)據(jù)對象:D={ai| ai ∈ElemSet,i=1,2,3……n,n≥0}</p&
8、gt;<p> 數(shù)據(jù)關(guān)系:R1={ <ai-1, ai ∈D,i=2,3……n}</p><p><b> 基本操作:</b></p><p> InitStack(&S)</p><p> 操作結(jié)果:構(gòu)造一個(gè)空棧</p><p> DestoryStack(&S)</
9、p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:棧S被銷毀。</p><p> ClearStack(&S)</p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:將S清為空棧。</p><p> StackEmpty(&S)</p
10、><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:若棧S為空棧,則返回TRUE,否則返回FALSE。</p><p> StackLength(&S)</p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:返回S的元素個(gè)數(shù),即棧的長度。</p><p>
11、; GetTop(S,&e)</p><p> 初始條件:棧S已存在且非空。</p><p> 操作結(jié)果:用e返回S的棧頂元素。</p><p> Push(S,&e)</p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:插入元素e為新的棧頂元素。</p>&
12、lt;p><b> Pop(S,&e)</b></p><p> 初始條件:棧S已存在且非空。</p><p> 操作結(jié)果:刪除S的棧頂元素,并用e返回其值。</p><p> StackTraverse(S,visit())</p><p> 初始條件:棧S已存在且非空。</p>
13、<p> 操作結(jié)果:從棧底到棧頂一次對S的每個(gè)元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。</p><p> }ADT stack</p><p> 隊(duì)列的抽象數(shù)據(jù)類型定義:</p><p> ADT Queue{</p><p> 數(shù)據(jù)對象:D={ai| ai ∈ElemSet,i=1,2,3……n,
14、n≥0}</p><p> 數(shù)據(jù)關(guān)系:R1={ <ai-1, ai ∈D,i=2,3……n}</p><p> 約定其中ai端為隊(duì)列頭,an端為隊(duì)列尾</p><p><b> 基本操作:</b></p><p> InitQueue(&Q)</p><p> 操作結(jié)果:構(gòu)
15、造一個(gè)空隊(duì)列Q。</p><p> DestoryQueue(&Q)</p><p> 初始條件:隊(duì)列Q已存在。</p><p> 操作結(jié)果:隊(duì)列Q被銷毀。</p><p> ClearQueue(&Q)</p><p> 初始條件:隊(duì)列Q已存在。</p><p>
16、操作結(jié)果:將Q清為空隊(duì)列。</p><p> QueuekEmpty(&Q)</p><p> 初始條件:隊(duì)列Q已存在。</p><p> 操作結(jié)果:若隊(duì)列Q為空棧,則返回TRUE,否則返回FALSE。</p><p> QueueLength(Q)</p><p> 初始條件:隊(duì)列Q已存在。<
17、/p><p> 操作結(jié)果:返回Q的元素個(gè)數(shù),即隊(duì)列的長度。</p><p> GetHead(Q,&e)</p><p> 初始條件:隊(duì)列Q已存在且非空。</p><p> 操作結(jié)果:用e返回Q的隊(duì)頭元素。</p><p> EnQueue(Q,&e)</p><p>
18、初始條件:隊(duì)列Q已存在。</p><p> 操作結(jié)果:插入元素e為新的隊(duì)尾元素。</p><p> DeQueue(Q,&e)</p><p> 初始條件:隊(duì)列Q已存在且非空。</p><p> 操作結(jié)果:刪除Q的隊(duì)頭元素,并用e返回其值。</p><p> QueueTraverse(Q,visit
19、())</p><p> 初始條件:Q已存在且非空。</p><p> 操作結(jié)果:從隊(duì)頭到隊(duì)尾一次對Q的每個(gè)元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。</p><p> }ADT queue</p><p><b> 2、主要算法流程圖</b></p><p> 算
20、符間的優(yōu)先關(guān)系為如下圖,其中#代表表達(dá)式的結(jié)束符,為了算法簡潔,在表達(dá)式的最左邊也虛設(shè)一個(gè)“#“構(gòu)成整個(gè)表達(dá)式的一對括號。</p><p> 3、各模塊間的層次調(diào)用</p><p><b> ?。?).算法思路 </b></p><p> a.若導(dǎo)入的是操作數(shù),則直接輸出到隊(duì)列。</p><p> b.若當(dāng)前運(yùn)算符
21、的優(yōu)先級高于棧頂運(yùn)算符的優(yōu)先級,則入棧。</p><p> c.若當(dāng)前運(yùn)算符的優(yōu)先級低于棧頂運(yùn)算符的優(yōu)先級,則棧頂運(yùn)算符退棧,并輸出到隊(duì)列,當(dāng)前運(yùn)算符再與新的棧頂運(yùn)算符比較。</p><p> d.若當(dāng)前運(yùn)算符的優(yōu)先級等于棧頂運(yùn)算符的優(yōu)先級,且棧頂運(yùn)算符為左括號,當(dāng)前運(yùn)算符為右括號,則棧頂運(yùn)算符退棧,繼續(xù)讀下一個(gè)符號。</p><p> e.若當(dāng)前運(yùn)算符的優(yōu)先
22、級等于棧頂運(yùn)算符的優(yōu)先級,且棧頂運(yùn)算符為“#“,當(dāng)前運(yùn)算符也為”#“,則棧頂運(yùn)算符退棧,輸出隊(duì)列中的數(shù)值即可。</p><p> ?。?).各個(gè)函數(shù)的含義</p><p> 頭函數(shù)結(jié)束以后用typedef struct snode{ }定義棧的結(jié)構(gòu)體,void initiatels(slnode *h){ }此函數(shù)是對棧的初始化,即構(gòu)造一個(gè)空棧,void pushls( slnode *
23、h,char *x){ }、char *popls( slnode *h,char *x){ },分別是進(jìn)棧出棧函數(shù)的實(shí)現(xiàn)。typedef struct qnode{ }隊(duì)列的結(jié)構(gòu)體定義,typedef struct{ }此函數(shù)是對隊(duì)列的初始化,即構(gòu)造一個(gè)空隊(duì)列,void initiatelq(lqtype *q){ }、void enterlq(lqtype *q,char *x){ },分別是入隊(duì)列以及出隊(duì)列的實(shí)現(xiàn)。這就是函數(shù)模塊的
24、實(shí)現(xiàn),除此之外在主函數(shù)main()函數(shù)中利用函數(shù)while(c!=“#“){ }即可獲取屏幕上輸入的字符,數(shù)據(jù)和運(yùn)算符并分別將其存放在結(jié)點(diǎn)中,利用函數(shù)while(x【0】!=35){ }來判斷x進(jìn)入符號棧還是隊(duì)列,enterlq(operand,x);說明x是數(shù)據(jù)則進(jìn)入隊(duì)列,利用函數(shù)if(a<=b){ }判斷如果x的優(yōu)先級大于當(dāng)前棧頂元素的優(yōu)</p><p><b> 五:調(diào)試分析</b&
25、gt;</p><p> 本實(shí)驗(yàn)要調(diào)試成功在此之前肯定遇到很多困難經(jīng)常會(huì)出現(xiàn)一些說明語法錯(cuò)誤以及出現(xiàn)一些語法錯(cuò)誤等各種各樣的問題,此時(shí)要檢查自己的代碼,找到自己代碼的問題所在,不折不撓多次調(diào)試即可。</p><p> 本實(shí)驗(yàn)的時(shí)間復(fù)雜度是O(n),空間復(fù)雜度為O(n)。此實(shí)驗(yàn)是利用一個(gè)棧和一個(gè)隊(duì)列,可以改進(jìn)為兩個(gè)棧的運(yùn)算,一個(gè)棧存放運(yùn)算符,另外一個(gè)棧存放運(yùn)算數(shù)據(jù)。</p>
26、<p> 本實(shí)驗(yàn)算法采用了鏈?zhǔn)酱鎯Y(jié)構(gòu),以開辟新空間為代價(jià),有效降低了算法時(shí)間復(fù)雜度和空間復(fù)雜度,并且對表達(dá)式的長度沒有要求。</p><p><b> 六:測試結(jié)果</b></p><p> 調(diào)試成功后進(jìn)入的頁面為</p><p><b> 輸入正確的表達(dá)式后</b></p><p
27、> 點(diǎn)擊y重新進(jìn)入主頁面</p><p> 若輸入錯(cuò)誤的表達(dá)式后</p><p><b> 七:附錄</b></p><p><b> 源程序</b></p><p> #include<stdio.h></p><p> #include &l
28、t;conio.h></p><p> #include<stdlib.h></p><p> #include<math.h></p><p> #include<string.h></p><p> #include<graphics.h></p><p&g
29、t; #define null 0</p><p> typedef struct snode //定義結(jié)構(gòu)體</p><p><b> {</b></p><p> char data[11];</p><p> struct snode *next;</p><p><b&g
30、t; }slnode;</b></p><p> void initiatels(slnode *h) //初始化</p><p><b> {</b></p><p> h->next = null;</p><p> }void pushls( slnode *h,char *x) //壓
31、棧</p><p><b> {</b></p><p> slnode *p;</p><p> p = (slnode *)malloc(sizeof(slnode));</p><p> strcpy(p->data,x);</p><p> p->next = h-&
32、gt;next;</p><p> h->next = p;</p><p><b> }</b></p><p> char *popls( slnode *h,char *x) //出棧</p><p><b> {</b></p><p> slnod
33、e *p;</p><p> p = h->next;</p><p> if(p!=null)</p><p><b> {</b></p><p> h->next = p->next;</p><p> return(p->data);</p>
34、<p><b> }</b></p><p> return(x);</p><p><b> }</b></p><p> typedef struct qnode //定義鏈隊(duì)列結(jié)構(gòu)體</p><p><b> {</b></p>&l
35、t;p> char data[11];</p><p> struct qnode *next;}qlnode;</p><p> typedef struct</p><p><b> {</b></p><p> qlnode *h;</p><p> qlnode *rea
36、r;</p><p><b> }lqtype;</b></p><p> void initiatelq(lqtype *q) //初始化</p><p><b> {</b></p><p> q->rear = q->h;</p><p> q-
37、>h->next = null;</p><p><b> }</b></p><p> void enterlq(lqtype *q,char *x) //入隊(duì)</p><p><b> {</b></p><p> qlnode *p;</p><p&g
38、t; p = (qlnode *)malloc(sizeof(qlnode));//申請新結(jié)點(diǎn)</p><p> strcpy(p->data,x); //新結(jié)點(diǎn)數(shù)據(jù)域賦值</p><p> p->next = null;</p><p> if(q->h==null)</p><p><b> q-&g
39、t;h = p;</b></p><p> q->rear->next = p;</p><p> q->rear = p; //修改尾指針</p><p><b> }</b></p><p> char *deletelq(lqtype *q,char *x) //出隊(duì)<
40、/p><p><b> {</b></p><p> qlnode *p;</p><p> p = q->h->next; // 暫存原隊(duì)頭指針</p><p> if(q->h->next!=null) //隊(duì)非空</p><p> { q->h-
41、>next=p->next; //刪除隊(duì)頭元素</p><p> if(q->h->next==null)</p><p> q->rear->next=null;</p><p> return(p->data);</p><p><b> }</b></p&g
42、t;<p> return(x);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> char ch[8]={'#','+','-','
43、;*','/','%','(',')'};</p><p> char c,cc, x[11],y[11],z[11];</p><p> int i,j,a,b,n;</p><p><b> int t;</b></p><p> sln
44、ode *operater,*pp;</p><p> lqtype *mid,*operand;</p><p> qlnode *ee;</p><p><b> int mm;</b></p><p> operater = (slnode *)malloc(sizeof(slnode));</p&g
45、t;<p> mid = (lqtype *)malloc(sizeof(lqtype));</p><p> mid->h = (qlnode *)malloc(sizeof(qlnode));</p><p> mid->rear = (qlnode *)malloc(sizeof(qlnode));</p><p> oper
46、and = (lqtype *)malloc(sizeof(lqtype));</p><p> operand->h = (qlnode*)malloc(sizeof(qlnode));</p><p> operand->rear = (qlnode *)malloc(sizeof(qlnode));</p><p> textmode(C80
47、);</p><p> textbackground(3);</p><p><b> clrscr();</b></p><p> window(8,8,70,18);</p><p> textbackground(7);</p><p> textcolor(18);</p&
48、gt;<p><b> clrscr();</b></p><p><b> while(1)</b></p><p> { //初始化</p><p> initiatelq(mid);</p><p> initiatels(operater);&l
49、t;/p><p> initiatelq(operand);</p><p><b> j = 0;</b></p><p><b> a = 0;</b></p><p><b> b = 0;</b></p><p><b> n =
50、 0;</b></p><p> for(i=0;i<11;i++)</p><p> x[i]='\0';</p><p><b> clrscr();</b></p><p> cprintf( "\nPlease input the biaodashi(begin
51、 by\"#\"from left and stop by\"#\"from right)\n");</p><p> cprintf("\nThe string is:");</p><p> c = getchar();</p><p><b> x[0]=c;</b&g
52、t;</p><p> enterlq(mid,x); //將“#“進(jìn)隊(duì)</p><p> c=getchar();</p><p><b> x[0]=c;</b></p><p><b> j=1;</b></p><p> c=getchar();</
53、p><p> while(c!='#') //獲取屏幕上輸入的字符,數(shù)據(jù)和運(yùn)算符分別存放在結(jié)點(diǎn)中</p><p><b> {</b></p><p> if(c<48&&c!=46)</p><p><b> {</b></p><p
54、> if(x[0]!=0)</p><p><b> {</b></p><p> enterlq(mid,x);</p><p> for(i = 0;i < 11;i++)</p><p> x[i]='\0';</p><p><b> j
55、= 0;</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>&l
56、t;b> x[0] = c;</b></p><p><b> j = 1;</b></p><p> ee=mid->rear;</p><p> if(ee->data[0]!='(')</p><p><b> {</b></p&g
57、t;<p> enterlq(mid,x);</p><p> for(i = 0;i < 11;i++)</p><p> x[i]='\0';</p><p><b> j=0;</b></p><p><b> }</b></p>&
58、lt;p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> x[j] = c;</b></p&
59、gt;<p><b> j++;</b></p><p><b> }</b></p><p> c=getchar();</p><p><b> }</b></p><p> if(x[0]!=0)</p><p><b
60、> {</b></p><p> enterlq(mid,x);</p><p> for(i = 0; i < 11;i++)</p><p> x[i]='\0';</p><p><b> }</b></p><p><b> x
61、[0] = c;</b></p><p> enterlq(mid,x);</p><p> for(i = 0;i <11; i++)</p><p> x[i]='\0';</p><p> getchar();</p><p> ee = mid->h->n
62、ext; //表達(dá)式合法性檢驗(yàn)</p><p> if(ee->data[0]!='#')</p><p><b> {</b></p><p> printf("\n ERROE!Please begin with \"#\"\n");</p>
63、<p> printf(" Continue?(y/n):",x);</p><p> cc = getchar();</p><p> getchar();</p><p> if(cc =='n'||cc=='N')</p><p><b>
64、 break;</b></p><p><b> else</b></p><p> if(cc =='y'||cc=='Y')</p><p><b> continue;</b></p><p><b> }</b><
65、;/p><p> while(ee->next!=null)</p><p><b> {</b></p><p> if(strlen(ee->data)==1&&ee->data[0]=='(')</p><p><b> a++;</b>&
66、lt;/p><p> if(strlen(ee->data)==1&&ee->data[0]==')')</p><p><b> b++;</b></p><p> if(strlen(ee->data)==1&&strlen(ee->next->data)==&
67、lt;/p><p> 1&&ee->data[0]<48&&ee->next->data[0]<48&&ee-></p><p> data[0]!=41&&ee->data[0]!=40&&ee->next->data[0]!=</p>&l
68、t;p> 41&&ee->next->data[0]!=40)</p><p><b> {</b></p><p><b> n=1;</b></p><p><b> break;</b></p><p><b> }&
69、lt;/b></p><p> ee = ee->next;</p><p><b> }</b></p><p> if(a!=b||n!=0)</p><p><b> {</b></p><p> printf("\n
70、 ERROE!Please input another time!");</p><p> printf("\n Continue?(y/n):",x);</p><p> cc = getchar();</p><p> getchar();</p><p> if(cc ==
71、9;n'||cc=='N')</p><p><b> break;</b></p><p><b> else</b></p><p> if(cc =='y'||cc=='Y')</p><p><b> continue
72、;</b></p><p><b> }</b></p><p> strcpy(x,deletelq(mid,z));</p><p> pushls(operater,x); //將“#“進(jìn)入符號棧</p><p> strcpy(x,deletelq(mid,z));//依次將mid出隊(duì)<
73、;/p><p> while (x[0]!=35)//判斷x進(jìn)入符號棧還是進(jìn)入隊(duì)列</p><p><b> {</b></p><p> if(x[0]>47||x[1]>47)</p><p> enterlq(operand,x);//x是數(shù)據(jù)則進(jìn)入隊(duì)列</p><p>
74、else if(x[0]!=41)</p><p><b> {</b></p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> while(y[0]!=40)</p><p><b> {
75、</b></p><p> for(i=6;i>=0;i--)</p><p><b> {</b></p><p> if(ch[i]==x[0])</p><p><b> a=i;</b></p><p> if(ch[i]==y[0])&l
76、t;/p><p><b> b=i;</b></p><p><b> }</b></p><p><b> if(a<=b)</b></p><p><b> {</b></p><p> enterlq(operan
77、d,popls(operater,z));</p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p><b> continue;</b></p><p> } //如果x的優(yōu)先級大于當(dāng)前棧頂元素的優(yōu)先級,則進(jìn)棧</p&g
78、t;<p> pushls(operater,x);</p><p><b> break;</b></p><p><b> }</b></p><p> if(y[0]==40)</p><p><b> {</b></p><p
79、> pushls(operater,x);</p><p> strcpy(x,deletelq(mid,z));</p><p><b> continue;</b></p><p><b> }</b></p><p> } //x是“)“,則依次輸出符號棧的元素,放進(jìn)隊(duì)列中,
80、知道遇到”(“為止</p><p><b> else</b></p><p><b> {</b></p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> while(y[0]
81、!=40)</p><p><b> {</b></p><p> enterlq(operand,popls(operater,z));</p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p><
82、b> }</b></p><p> strcpy(y,popls(operater,z));</p><p><b> }</b></p><p> strcpy(x,deletelq(mid,z));</p><p><b> }</b></p><
83、p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> //mid為空后,一次輸出符號棧的元素至隊(duì)列中,直到遇到“#“為止</p><p> while (y[0]!=35)</p><p><b> {</b></p>
84、;<p> enterlq(operand,popls(operater,z));</p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> }//最終operand為后綴表達(dá)式</p><p> ee=operand->h-&
85、gt;next;//求出后綴表達(dá)式的值</p><p> while(operand->h->next->next!=null)</p><p><b> {</b></p><p> strcpy(x,ee->data);</p><p> strcpy(y,ee->next-&g
86、t;data);</p><p> if(ee->next->next!=null)</p><p> strcpy(z,ee->next->next->data);</p><p><b> else</b></p><p><b> {</b></p&
87、gt;<p> ee=operand->h->next;</p><p><b> continue;</b></p><p><b> }</b></p><p> if((x[0]>47||x[1]>47)&&(y[0]>47||y[1]>47)
88、&&(z[0]<</p><p> 48&&strlen(z)==1))</p><p><b> {</b></p><p> switch(z[0])</p><p><b> {</b></p><p> case
89、9;+':mm=atof(x)+atof(y);</p><p><b> break;</b></p><p> case '-':mm=atof(x)-atof(y);</p><p><b> break;</b></p><p> case '*
90、9;:mm=atof(x)*atof(y);</p><p><b> break;</b></p><p> case '/':mm=atof(x)/atof(y);</p><p><b> break;</b></p><p> case '%':mm=
91、atoi(x)%atoi(y);</p><p><b> break;</b></p><p><b> }</b></p><p> strcpy(ee->data,gcvt(mm,11,z)); ee->next=ee->next->n
92、ext->next;</p><p> ee=operand->h->next;</p><p><b> continue;</b></p><p><b> }</b></p><p> if(ee->next->next!=null)</p>
93、<p> ee=ee->next;</p><p><b> else</b></p><p> ee=operand->h->next;</p><p><b> }</b></p><p> strcpy(x,deletelq(operand,z)); /
94、/輸出最終結(jié)果</p><p> printf("\n The end:%s\n",x);</p><p> printf(" Continue?(y/n)",x);</p><p> cc=getchar();</p><p> getchar();</
95、p><p> if(cc=='n'||cc=='N')</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> 利用樹進(jìn)行哈弗曼編
96、碼</p><p><b> 一:問題描述</b></p><p> 利用哈弗曼編碼進(jìn)行通信可以大大提高信道的利用率,縮短信息傳輸時(shí)間,降低傳輸成本,但是,這要求發(fā)送端通過一個(gè)編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼,在接收端將傳來的數(shù)據(jù)進(jìn)行譯碼,對于雙工通道(即可以雙向傳輸?shù)男诺溃?,每端都要有一個(gè)完整的編碼譯碼系統(tǒng),因此可以設(shè)計(jì)一個(gè)編碼譯碼系統(tǒng)解決這樣一個(gè)問題。</p&
97、gt;<p><b> 二:實(shí)驗(yàn)內(nèi)容</b></p><p> 文件conf.txt中保存了若干字母及其出現(xiàn)的頻度,要求所有頻度加起來要為1,否則載入時(shí)報(bào)錯(cuò)。字母及其頻度保存的格式為:</p><p><b> a:0.1</b></p><p><b> b:0.2</b>&l
98、t;/p><p><b> c:0.3</b></p><p><b> ……</b></p><p> 界面上,首先出現(xiàn)一個(gè)按鈕,點(diǎn)擊,載入conf.txt。然后輸入一個(gè)字符串,由這些字母組成。點(diǎn)擊按鈕,顯示哈夫曼編碼的結(jié)果。同時(shí),界面上如果輸入哈夫曼編碼,也能被翻譯成相應(yīng)的字母。如果輸入格式錯(cuò)誤,要求給予提示。<
99、;/p><p><b> 三:概要設(shè)計(jì)</b></p><p> 1、系統(tǒng)結(jié)構(gòu)圖(功能模塊圖)</p><p><b> 2、功能模塊說明</b></p><p> ?。?)、編碼:讀取文件——建立哈夫曼樹——對文本進(jìn)行哈弗曼編碼并輸出編碼</p><p> ?。?)、譯碼
100、:提示輸入需要譯碼的字符——利用建好的哈夫曼樹進(jìn)行譯碼</p><p> (3)、退出:退出系統(tǒng),程序運(yùn)行結(jié)束。</p><p><b> 四:詳細(xì)設(shè)計(jì)</b></p><p><b> 主要算法流程圖 </b></p><p><b> 創(chuàng)建哈夫曼樹</b><
101、/p><p><b> 編碼</b></p><p><b> 譯碼</b></p><p><b> 五:調(diào)試分析</b></p><p> 從葉子節(jié)點(diǎn)開始向上遍歷樹,獲得哈弗曼編碼;</p><p> 根據(jù)哈弗曼編碼遍歷哈夫曼樹直到葉子結(jié)點(diǎn),得
102、到譯碼;</p><p> 算法時(shí)間復(fù)雜度的分析:時(shí)間復(fù)雜度為O(n2);</p><p> 算法空間復(fù)雜度的分析:空間復(fù)雜度為O(n)。</p><p><b> 六:測試結(jié)果</b></p><p> 由于本實(shí)驗(yàn)是圖形化界面,故無法得到完整的圖形界面,但進(jìn)入主頁面以后即可看到以下界面。</p>
103、<p> 這將是進(jìn)入之后點(diǎn)擊譯碼所得到的界面</p><p> 再次點(diǎn)擊回車即可看到如圖所示</p><p><b> 七:附錄</b></p><p> #include<stdio.h></p><p> #include<string.h></p><
104、p> #include<graphics.h></p><p> #include<conio.h></p><p> #include<dos.h></p><p> #include<alloc.h></p><p> #include<ctype.h></
105、p><p> #define UP 50</p><p> #define DOWN 90</p><p> #define LEFT 60</p><p> #define RIGHT 55</p><p> #define ENTER 40</p><p> #define N 50
106、</p><p> #define M 2*N-1</p><p> #define SIZE 6</p><p> typedef struct //定義結(jié)構(gòu)體存放哈夫曼碼</p><p><b> {</b></p><p> char data;</p><
107、p> float weight;</p><p> int parent,lchild,rchild;</p><p><b> }HTNode;</b></p><p> int choice;</p><p><b> int key()</b></p><p
108、><b> {</b></p><p> union REGS lf;</p><p> lf.h.ah=0;</p><p> int86(0x16,&lf,&lf);</p><p> return lf.h.ah;</p><p><b> }&l
109、t;/b></p><p> struct imformation</p><p><b> {</b></p><p><b> char ch;</b></p><p> float fre;</p><p><b> }</b>&l
110、t;/p><p> imfor[SIZE]={{'a',0.3},{'b',0.2},{'c',0.1},{'d',0.2},{'e',0.1},{'f',0.1}};</p><p> //給相關(guān)字符設(shè)置初值</p><p> typedef struct</p
111、><p><b> {</b></p><p> char cd[N];</p><p> int start;</p><p><b> }HCode;</b></p><p> void CreateHT(HTNode ht[],int n)</p>
112、<p><b> {</b></p><p> int i,k,lnode,rnode;</p><p> float min1,min2; for (i=0;i<2*n-1;i++)</p><p> ht[i].parent=ht[i].lchild=ht[i].rchild=-1;</p&
113、gt;<p> for (i=n;i<2*n-1;i++) //構(gòu)造哈夫曼樹</p><p><b> {</b></p><p> min1=min2=1.1; //使用兩個(gè)最小權(quán)值的結(jié)點(diǎn)為左孩子和右孩子</p><p> lnode=rnode=-1;</p><p> for (k=
114、0;k<=i-1;k++)</p><p> if (ht[k].parent==-1)</p><p><b> {</b></p><p> if (ht[k].weight<min1)</p><p><b> {</b></p><p> min
115、2=min1;rnode=lnode;</p><p> min1=ht[k].weight;lnode=k;</p><p><b> }</b></p><p> else if (ht[k].weight<min2)</p><p><b> {</b></p>&
116、lt;p> min2=ht[k].weight;rnode=k;</p><p><b> }</b></p><p><b> }</b></p><p> ht[lnode].parent=i;ht[rnode].parent=i;</p><p> ht[i].weight=h
117、t[lnode].weight+ht[rnode].weight;</p><p> ht[i].lchild=lnode;ht[i].rchild=rnode;</p><p><b> }</b></p><p> getchar();</p><p><b> }</b></p&
118、gt;<p> void CreateHCode(HTNode ht[],HCode hcd[],int n)</p><p><b> {</b></p><p> int i,f,j,c;</p><p><b> HCode hc;</b></p><p> for (
119、i=0;i<n;i++) //根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b> {</b></p><p> hc.start=n;</p><p><b> c=i;</b></p><p> f=ht[i].parent;</p><p> while
120、 (f!=-1) //回溯到樹根結(jié)點(diǎn)</p><p><b> {</b></p><p> if (ht[f].lchild==c) //遍歷做孩子結(jié)點(diǎn)</p><p> hc.cd[hc.start--]='0';</p><p> else //遍歷孩子的右結(jié)點(diǎn)</p>
121、<p> hc.cd[hc.start--]='1';</p><p> c=f;f=ht[f].parent;</p><p><b> }</b></p><p> hc.start++;</p><p> hcd[i]=hc;</p><p><b
122、> }</b></p><p><b> }</b></p><p> void huffmancode(HTNode ht[],HCode hcd[],int n)</p><p><b> {</b></p><p> char b[M],*p;</p>
123、<p> int i,j,m,k;</p><p> printf("please input the words:\n");</p><p> scanf("%s",b);</p><p> m=strlen(b);</p><p> for(i=0,p=b;i<m;i++
124、,p++)</p><p><b> {</b></p><p> for(j=0;j<n;j++)</p><p> if(ht[j].data==*p)</p><p> for (k=hcd[j].start;k<=n;k++)</p><p> printf(&quo
125、t;%c",hcd[j].cd[k]);</p><p><b> }</b></p><p><b> getch();</b></p><p> printf("\n");</p><p><b> }</b></p>&
126、lt;p> void words(HTNode ht[],int n)</p><p><b> {</b></p><p><b> int c;</b></p><p> char code[1000],*p;</p><p> printf("please input
127、 numbers:\n");</p><p> scanf("%s",code);</p><p> for(p=code,c=2*n-2;*p!='\0';p++)</p><p><b> {</b></p><p> if(*p=='0')<
128、;/p><p><b> {</b></p><p> c=ht[c].lchild;</p><p> if(ht[c].lchild==-1)</p><p><b> {</b></p><p> printf("%c",ht[c].data)
129、;</p><p><b> c=2*n-2;</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> }</b></p><p> else if(*
130、p=='1')</p><p><b> {</b></p><p> c=ht[c].rchild;</p><p> if(ht[c].lchild==-1)</p><p><b> {</b></p><p> printf("%c
131、",ht[c].data);</p><p><b> c=2*n-2;</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> }</b></p>&l
132、t;p><b> }</b></p><p><b> getch();</b></p><p> printf("\n");</p><p><b> }</b></p><p> mainmenu()</p><p&g
133、t;<b> {</b></p><p> cleardevice();</p><p> setbkcolor(3); //設(shè)置當(dāng)前背景顏色</p><p> setcolor(2); //設(shè)置當(dāng)前畫筆顏色</p><p> rectangle(40,60,600,440);</p>&l
134、t;p> line(40,100,600,100);</p><p> outtextxy(240,80,"Huffman");</p><p> rectangle(150,145,350,195);</p><p> setfillstyle(1,12);</p><p> floodfill(160,
135、150,14);</p><p> outtextxy(152,150,"a. Print huffman code");</p><p> outtextxy(152,200,"b. Print words");</p><p> outtextxy(152,250,"c. Quit");</
136、p><p><b> }</b></p><p> void change(char *select[],int n1,int n2,int x0,int len,int y0,int wid1,int wid2)</p><p> //完成兩個(gè)窗口間的互換</p><p><b> {</b>
137、</p><p> setviewport(x0,y0+wid2*n1,x0+len,y0+wid1+wid2*n1,1);</p><p> clearviewport();</p><p> setcolor(2); //設(shè)置當(dāng)前背景顏色</p><p> settextstyle(4,0,10);</p>&l
138、t;p> outtextxy(2,5,select[n1]);</p><p> setviewport(x0,y0+wid2*n2,x0+len,y0+wid1+wid2*n2,1);</p><p> clearviewport();</p><p> setfillstyle(1,12);</p><p> setcol
139、or(2);</p><p> rectangle(0,0,len,wid1);</p><p> floodfill(30,5,1);</p><p> setcolor(1);</p><p> settextstyle(4,0,10);</p><p> outtextxy(2,5,select[n2]
140、);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> int n=SIZE,i,a,j,n1=0,n2=0;</p><p> float sum=0;</p>&
141、lt;p> char *select[3]={"a.Print huffman code","b.Print words","c.Quit"};</p><p> HTNode ht[M];</p><p> HCode hcd[N];</p><p><b> FILE *fp;&
142、lt;/b></p><p> char b[M];</p><p> int graphdriver=DETECT,graphmode;</p><p> initgraph(&graphdriver,&graphmode,"\\TC++");</p><p> registerbgidri
143、ver(EGAVGA_driver);</p><p> cleardevice();</p><p> setbkcolor(1);</p><p> setviewport(0,0,639,479,1);</p><p> clearviewport();</p><p> setbkcolor(1);&
144、lt;/p><p> setcolor(2);</p><p> rectangle(250,200,390,280);//在圖形界面上畫一個(gè)矩形框</p><p> setfillstyle(1,5);</p><p> floodfill(300,240,14);</p><p> settextstyle(
145、4,0,10);</p><p> outtextxy(252,202,"ENTER");</p><p> outtextxy(200,10," THE HUFFMANCODE TRANSLATOR"); line(0,30,640,30);</p><p> getchar();<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)線性表答案
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--基于線性表下的查找與排序
- 線性表數(shù)據(jù)結(jié)構(gòu)試驗(yàn)
- 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)-線性表基本操作
- 算法與數(shù)據(jù)結(jié)構(gòu) 線性表答案
- 數(shù)據(jù)結(jié)構(gòu) 第2章 線性表
- 桂電數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)一-線性表
- 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)(1)線性表及其應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--課程表設(shè)計(jì)
- 課程設(shè)計(jì)1線性表課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)線性表多項(xiàng)式加減實(shí)驗(yàn)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)》第二章線性表習(xí)題
- 數(shù)據(jù)結(jié)構(gòu)-線性表輸入,輸出,插入,刪除,查找
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論