2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  目 錄</b></p><p><b>  1概述3</b></p><p>  1.1目的及意義3</p><p><b>  2系統(tǒng)分析3</b></p><p><b>  2.1需求分析3</b></p&

2、gt;<p><b>  3概要設(shè)計(jì)3</b></p><p>  3.1系統(tǒng)總體結(jié)構(gòu)3</p><p>  3.2程序算法圖3</p><p><b>  4詳細(xì)設(shè)計(jì)4</b></p><p>  4.1中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式4</p><p>

3、  4.1.1求運(yùn)算符優(yōu)先級(jí)函數(shù)5</p><p>  4.1.2輸出隊(duì)列5</p><p>  4.2后綴表達(dá)式的求值5</p><p><b>  5運(yùn)行與測(cè)試6</b></p><p>  5.1 輸入表達(dá)式:6</p><p>  5.2 輸出結(jié)果:6</p>&

4、lt;p><b>  6總結(jié)和心得6</b></p><p>  6.1心得與問題6</p><p><b>  6.2總結(jié)6</b></p><p><b>  參考文獻(xiàn)7</b></p><p><b>  1概述</b></p&g

5、t;<p><b>  1.1目的及意義</b></p><p>  我們?cè)诤茉绲臅r(shí)候就開始學(xué)習(xí)書寫及計(jì)算表達(dá)式,可以說運(yùn)用起來很熟練了,但有時(shí)候并不想自己計(jì)算,交給計(jì)算器是時(shí)有的事,然而普通的計(jì)算器并不懂得優(yōu)先級(jí),給計(jì)算帶來了一定的不便。</p><p>  本程序?qū)崿F(xiàn)的目的是將人們習(xí)慣的中綴表達(dá)式轉(zhuǎn)換為計(jì)算機(jī)所能理解的后綴表達(dá)式以方便計(jì)算,最終得出我

6、們所需要的正確的答案。</p><p><b>  2系統(tǒng)分析</b></p><p><b>  2.1需求分析</b></p><p>  當(dāng)我們需要進(jìn)行一長(zhǎng)串的計(jì)算時(shí),各種運(yùn)算符夾雜在一起,通過筆算很容易得出結(jié)果。然而計(jì)算機(jī)并沒有人腦那么聰明,它并不懂得先乘除后加減,有括號(hào)要先計(jì)算括號(hào)里面的,它只知道從左到右的進(jìn)行

7、計(jì)算,這就造成了計(jì)算機(jī)計(jì)算的失誤,科學(xué)的計(jì)算是人們非常需要的計(jì)算工具。</p><p><b>  3概要設(shè)計(jì)</b></p><p><b>  3.1系統(tǒng)總體結(jié)構(gòu)</b></p><p>  整個(gè)系統(tǒng)結(jié)構(gòu)如圖3-1-1所示,結(jié)構(gòu)非常清楚,程序順序執(zhí)行,首先提示用戶輸入需要計(jì)算的表達(dá)式,經(jīng)過轉(zhuǎn)換得到后綴表達(dá)式,最后結(jié)果將

8、數(shù)據(jù)顯示到主屏幕上即可。</p><p>  圖3.1.1 系統(tǒng)總體結(jié)構(gòu)圖</p><p><b>  3.2程序算法圖</b></p><p>  本程序所用的數(shù)據(jù)結(jié)構(gòu)類型是棧和隊(duì)列。</p><p>  首先提示用戶輸入中綴表達(dá)式,再利用程序?qū)⒅芯Y表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,其中數(shù)字入隊(duì)列,算術(shù)運(yùn)算符入棧。</p&

9、gt;<p>  圖3.2.1 程序算法圖</p><p><b>  4詳細(xì)設(shè)計(jì)</b></p><p>  4.1中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式</p><p>  將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式首先需要掃描中綴表達(dá)式,當(dāng)遇到數(shù)字時(shí),將其入隊(duì)列,當(dāng)遇到運(yùn)算符時(shí),若是低優(yōu)先級(jí)則直接入棧,若是高優(yōu)先級(jí)則將低優(yōu)先級(jí)運(yùn)算符彈出,并入隊(duì)列,再

10、將此次運(yùn)算符入棧,最終形成后綴表達(dá)式</p><p>  圖4.1.1后綴表達(dá)式的轉(zhuǎn)換</p><p><b>  其偽代碼算法如下:</b></p><p>  switch(c){</p><p>  case '0' to case '9' :EnQueue(Q,c)</p&g

11、t;<p>  case '(': Push(S,c)</p><p>  case ')' to case'#': t=Pop(S);</p><p>  if (t!='(' && t!='#')</p><p>  EnQueue(Q,t);</

12、p><p>  } while (t!='(' && S->top!=-1);</p><p>  case '+' || case '-'|| case '*'|| case '/':</p><p>  while (Priority(c)<=Priority

13、(GetTop(S)))//比較優(yōu)先級(jí)</p><p>  EnQueue(Q, Pop(S))</p><p><b>  Push(S,c)</b></p><p><b>  }</b></p><p>  4.1.1求運(yùn)算符優(yōu)先級(jí)函數(shù)</p><p>  算術(shù)運(yùn)算符

14、入棧時(shí)必須考慮運(yùn)算符的優(yōu)先級(jí),才能形成正確的后綴表達(dá)式,當(dāng)讀到運(yùn)算符時(shí),將棧中所有優(yōu)先級(jí)高于或等于該運(yùn)算符的運(yùn)算符彈出,送至輸出隊(duì)列中,再將當(dāng)前運(yùn)算符入棧;當(dāng)讀入左括號(hào)時(shí),即入棧;當(dāng)讀到右括號(hào)時(shí),將靠近棧頂?shù)牡谝粋€(gè)左括號(hào)上面的運(yùn)算符全部依次彈出,送至輸出隊(duì)列中,再刪除棧中的左括號(hào)。</p><p>  通過返回值的大小代表優(yōu)先級(jí)的大小,其偽代碼算法如下:</p><p>  switch

15、(op){</p><p>  case '('||case '#': return 0;break;</p><p>  case '-'||case '+':return 1;break;</p><p>  case '*'|| case '/':return 2;

16、break;</p><p><b>  }</b></p><p><b>  4.1.2輸出隊(duì)列</b></p><p>  當(dāng)中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式之后,需要輸出后綴表達(dá)式,也就是當(dāng)前隊(duì)列,只需要讓頭指針遍歷輸出數(shù)據(jù)即可。</p><p><b>  其偽代碼如下:</b&

17、gt;</p><p>  x=Q->data[Q->front++];</p><p>  4.2后綴表達(dá)式的求值</p><p>  由于在將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式時(shí)已經(jīng)將運(yùn)算符安排在了合適的位置,在后綴表達(dá)式中不僅不需要括號(hào),而且還完全免除了運(yùn)算符優(yōu)先規(guī)則,僅需從左到右計(jì)算即可。</p><p><b>  

18、其偽代碼如下:</b></p><p>  while(!QueueEmpty(Q)){</p><p>  ch=DeQueue(Q)</p><p>  if (ch>='0' && ch<='9')</p><p>  Push(S,ch-'0';

19、)//數(shù)字字符到數(shù)值的轉(zhuǎn)換</p><p><b>  else{</b></p><p>  y=Pop(S),x=Pop(S)</p><p>  switch (ch){</p><p>  case '+':Push(S,x+y);break;</p><p>  case

20、 '-':Push(S,x-y);break;</p><p>  case '*':Push(S,x*y);break;</p><p>  case '/':Push(S,x/y);break;</p><p><b>  }</b></p><p><b>

21、  }</b></p><p><b>  5運(yùn)行與測(cè)試</b></p><p>  5.1 輸入表達(dá)式:</p><p>  輸入一個(gè)中綴表達(dá)式:</p><p><b>  5.2 輸出結(jié)果:</b></p><p>  輸出后綴表達(dá)式及其結(jié)果:</p&

22、gt;<p><b>  6總結(jié)和心得</b></p><p><b>  6.1心得與問題</b></p><p>  在本次實(shí)驗(yàn)中,遇到的心得:</p><p>  為什么有判空隊(duì)列不需要判空棧?因?yàn)楫?dāng)S->top=-1時(shí)棧變?yōu)榭?,不需要單?dú)寫一個(gè)函數(shù)出來判斷。</p><p&g

23、t;  后綴表達(dá)式的求值中,Push(S,ch-'0')中的ch-‘0’是什么意思?因?yàn)檩斎氡磉_(dá)式時(shí)數(shù)字是以字符的形式存儲(chǔ)的,當(dāng)進(jìn)行計(jì)算式需要字符到數(shù)值的轉(zhuǎn)換。</p><p>  中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式時(shí)為什么要用Push(S,'#')將#壓入棧底?</p><p>  后綴表達(dá)式的求值中,SeqStack vs的作用是什么?為什么不用vs會(huì)出錯(cuò)?&l

24、t;/p><p>  調(diào)用后綴表達(dá)式進(jìn)行計(jì)算時(shí),最終計(jì)算結(jié)果是放在棧中的,但為什么返回棧頂元素時(shí)總是指向空?因?yàn)橹罢{(diào)用了Dequeue(Q),導(dǎo)致front發(fā)生了改變,相當(dāng)于隊(duì)列被刪除了,所以再調(diào)用時(shí)就為空了,解決方法有多種,比如復(fù)制隊(duì)列,我采取了一個(gè)簡(jiǎn)單的方法,在調(diào)用了CTPostExp(Q)后不忙著輸出后綴表達(dá)式,繼續(xù)調(diào)用CPostExp(Q),在CPostExp(Q)中使用Dequeue(Q)時(shí)順便就將后綴表

25、達(dá)式輸出,這樣就避免了隊(duì)列第二次調(diào)用時(shí)已經(jīng)被刪除的窘境。</p><p><b>  6.2總結(jié)</b></p><p>  本次試驗(yàn)中內(nèi)存出錯(cuò)的情況比較多,比如在輸出后綴表達(dá)式時(shí)雖然結(jié)果正確,但后面還有很多“燙燙…”,在計(jì)算后綴表達(dá)式時(shí),返回值總是沒有,等等,但通過不斷地調(diào)試這些問題都得以解決。</p><p>  通過本次實(shí)驗(yàn),加強(qiáng)了對(duì)棧和

26、隊(duì)列的存儲(chǔ)結(jié)構(gòu)的理解,尤其是棧的先進(jìn)后出的結(jié)構(gòu)有了更深的了解。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1]蘇仕華等. 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).機(jī)械工業(yè)出版社.2005.05</p><p>  [2]嚴(yán)蔚敏,吳偉明. 數(shù)據(jù)結(jié)構(gòu)(C語言版).清華大學(xué)出版社.2007</p><p>  [3]譚浩強(qiáng)

27、. C程序設(shè)計(jì)(第三版). 清華大學(xué)出版社. 2005</p><p><b>  附加程序代碼:</b></p><p>  #include<stdio.h></p><p>  #define StackSize 100</p><p>  #define QueueSize 100</p>

28、<p>  typedef char DataType;</p><p>  typedef struct</p><p><b>  {</b></p><p>  char data[100];</p><p>  int front,rear;</p><p>  }SeqQu

29、eue;//定義隊(duì)列類型</p><p>  typedef struct</p><p><b>  {</b></p><p>  DataType data[100];</p><p><b>  int top;</b></p><p>  }SeqStack;//棧

30、類型的定義</p><p><b>  //初始化隊(duì)列</b></p><p>  void InitQueue(SeqQueue * Q)</p><p><b>  {</b></p><p>  Q->front=0;</p><p>  Q->rear=

31、0;//頭部和尾部分別賦值為0</p><p><b>  }</b></p><p><b>  //清空隊(duì)列</b></p><p>  int QueueEmpty(SeqQueue * Q)</p><p><b>  {</b></p><p&

32、gt;  return Q->rear==Q->front;//隊(duì)列的頭指針等于尾指針</p><p><b>  }</b></p><p><b>  //入隊(duì)列</b></p><p>  void EnQueue(SeqQueue * Q,DataType x)</p><p>

33、;<b>  {</b></p><p>  if((Q->rear+1) % QueueSize == Q->front)//判斷隊(duì)列是否裝滿</p><p>  printf("隊(duì)列溢出");</p><p><b>  else</b></p><p>&

34、lt;b>  {</b></p><p>  Q->data[Q->rear]=x;</p><p>  Q->rear=(Q->rear+1)%QueueSize;</p><p><b>  }</b></p><p><b>  }</b></p

35、><p><b>  //輸出隊(duì)列</b></p><p>  char DeQueue(SeqQueue * Q)</p><p><b>  {</b></p><p><b>  char x;</b></p><p>  x=Q->data[Q

36、->front];</p><p>  Q->front++;</p><p><b>  return x;</b></p><p><b>  }</b></p><p><b>  //初始化棧</b></p><p>  void

37、InitStack(SeqStack * S)</p><p><b>  {</b></p><p>  S->top=-1;</p><p><b>  }</b></p><p><b>  //入棧</b></p><p>  void P

38、ush(SeqStack * S,DataType x)</p><p><b>  {</b></p><p>  if(S->top==StackSize-1)</p><p>  printf("棧溢出");</p><p><b>  else</b></p&

39、gt;<p><b>  {</b></p><p>  S->top=S->top+1;//棧頂指針指向新插入的數(shù)據(jù)</p><p>  S->data[S->top]=x;</p><p><b>  }</b></p><p><b>  }

40、</b></p><p><b>  //出棧</b></p><p>  DataType Pop(SeqStack * S)</p><p><b>  {</b></p><p>  if(S->top==-1)</p><p>  printf(&q

41、uot;空棧");</p><p><b>  else</b></p><p>  returnS->data[S->top--];</p><p><b>  }</b></p><p><b>  //取棧頂元素</b></p>&l

42、t;p>  DataType GetTop(SeqStack * S)</p><p><b>  {</b></p><p>  if(S->top==-1)</p><p>  printf("???quot;);</p><p><b>  else</b></p&

43、gt;<p>  returnS->data[S->top]; </p><p><b>  }</b></p><p>  //求運(yùn)算符優(yōu)先級(jí)函數(shù)</p><p>  int Priority(DataType op)</p><p><b>  {</b></

44、p><p>  switch (op)</p><p><b>  {</b></p><p><b>  case '(':</b></p><p>  case '#':return 0;break;</p><p><b>  ca

45、se '-':</b></p><p>  case '+':return 1;break;</p><p><b>  case '*':</b></p><p>  case '/':return 2;break;</p><p><b

46、>  }</b></p><p><b>  }</b></p><p>  //中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式</p><p>  void CTPostExp(SeqQueue * Q)</p><p><b>  {</b></p><p>  SeqSt

47、ack OS;//運(yùn)算符棧</p><p><b>  char c,t;</b></p><p>  SeqStack * S;</p><p><b>  S=&OS;</b></p><p>  InitStack(S);</p><p>  Push(S,&

48、#39;#');//壓入棧底元素#</p><p>  do//掃描中綴表達(dá)式</p><p><b>  {</b></p><p>  c=getchar();</p><p><b>  switch(c)</b></p><p><b>  {&

49、lt;/b></p><p>  case ' ': break;//去除空格符</p><p><b>  case '0':</b></p><p><b>  case '1':</b></p><p><b>  case

50、'2':</b></p><p><b>  case '3':</b></p><p><b>  case '4':</b></p><p><b>  case '5':</b></p><p>

51、<b>  case '6':</b></p><p><b>  case '7':</b></p><p><b>  case '8':</b></p><p><b>  case '9':</b></

52、p><p>  EnQueue(Q,c);break;</p><p>  case '(':Push(S,c); break;</p><p><b>  case ')':</b></p><p><b>  case '#':</b><

53、/p><p><b>  do </b></p><p><b>  {</b></p><p><b>  t=Pop(S);</b></p><p>  if (t!='(' && t!='#')</p><p

54、>  EnQueue(Q,t);</p><p>  } while (t!='(' && S->top!=-1); break;</p><p><b>  case '+':</b></p><p><b>  case '-':</b>

55、</p><p><b>  case '*':</b></p><p><b>  case '/':</b></p><p>  while (Priority(c)<=Priority(GetTop(S)))//比較優(yōu)先級(jí)</p><p><b&g

56、t;  {</b></p><p><b>  t=Pop(S);</b></p><p>  EnQueue(Q,t);</p><p><b>  }</b></p><p>  Push(S,c);</p><p><b>  break;<

57、/b></p><p><b>  }</b></p><p>  }while(c!='#');</p><p><b>  }</b></p><p>  //后綴表達(dá)式的求值</p><p>  int CPostExp(SeqQueue * Q

58、)</p><p><b>  {</b></p><p>  SeqStack vs,*S;</p><p><b>  char ch;</b></p><p><b>  int x,y;</b></p><p>  S=&vs;/

59、/有什么用</p><p>  InitStack(S);</p><p>  while(!QueueEmpty(Q))</p><p><b>  {</b></p><p>  ch=DeQueue(Q);</p><p>  printf("%c",ch);//輸出后

60、綴表達(dá)式</p><p>  if (ch>='0' && ch<='9')</p><p>  Push(S,ch-'0');//數(shù)字字符到數(shù)值的轉(zhuǎn)換</p><p><b>  else</b></p><p><b>  {<

61、;/b></p><p><b>  y=Pop(S);</b></p><p><b>  x=Pop(S);</b></p><p>  switch (ch)</p><p><b>  {</b></p><p>  case '+

62、':Push(S,x+y);break;</p><p>  case '-':Push(S,x-y);break;</p><p>  case '*':Push(S,x*y);break;</p><p>  case '/':Push(S,x/y);break;</p><p>&

63、lt;b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("\n");</p><p>  printf("最終結(jié)果為:");</p><p

64、>  printf("%d\n",GetTop(S));</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  //主函數(shù)</b></p><p>  void main()<

65、/p><p><b>  {</b></p><p>  printf("輸入一個(gè)中綴表達(dá)式并以“#”做結(jié)束符:");</p><p>  SeqQueue *Q;</p><p>  SeqQueue PostQ;//定義隊(duì)列,存放后綴表達(dá)式</p><p><b>

66、  Q=&PostQ;</b></p><p>  InitQueue(Q);//初始化隊(duì)列</p><p>  CTPostExp(Q);//調(diào)用函數(shù)將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式</p><p>  printf("后綴表達(dá)式為:");</p><p>  CPostExp(Q);//調(diào)用函數(shù)計(jì)算出后

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論