數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---利用線性表進(jìn)行算式計(jì)算_第1頁
已閱讀1頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論