數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達(dá)式求值_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</b></p><p>  算符優(yōu)先法對算術(shù)表達(dá)式求值 </p><p><b>  目錄</b></p><p>  一,課程題目 ........................................................

2、........... 1</p><p>  二,程序設(shè)計思想 .......................................................... 1</p><p>  三,程序流程圖 ............................................................. 1</p>

3、<p>  四,程序關(guān)鍵代碼設(shè)計 ................................................... 1</p><p>  五,程序源代碼以及運行結(jié)果 ......................................... 3</p><p>  六,心得體會 ............................

4、......................................... 7</p><p><b>  一,課程題目</b></p><p> ?。ㄋ惴麅?yōu)先法計算算數(shù)表達(dá)式)以字符序列的形式從終端輸入語法正確的、不含變量的整數(shù)表達(dá)式。利用教材表3.1(P53)給出的算符優(yōu)先關(guān)系,實現(xiàn)對于算術(shù)四則混合運算(加、減、乘、除)表達(dá)式的求值。例如:7+(4-2

5、)*3+12/2=19。注:按照四舍五入的方式將四則運算結(jié)果取整。</p><p><b>  二,程序設(shè)計思想</b></p><p>  在程序中分別設(shè)立一個運算符棧(OPTR 棧),用于存儲‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用于判斷算術(shù)表達(dá)式結(jié)束),和一個操作數(shù)棧(OPND 棧),用于存放整數(shù),輸入算式后,先將數(shù)字與運算符分開入i棧,若為數(shù)字則先用轉(zhuǎn)

6、換函數(shù)將char類型的數(shù)轉(zhuǎn)換為int型并進(jìn)入操作數(shù)棧,若為運算符則根據(jù)教材表3.1(P53)給出的算符優(yōu)先級關(guān)系,判斷棧頂運算符和從鍵盤取得的運算符作優(yōu)先級比較,若取得的運算符優(yōu)先級高則進(jìn)棧,直到取得運算符優(yōu)先級低的,則將操作數(shù)取出作operate運算后存入棧頂,反復(fù)操作知道遇到‘#’,則結(jié)束運算,輸出棧頂元素即為結(jié)果。</p><p><b>  三,程序流程圖</b></p>

7、<p>  四,程序關(guān)鍵代碼設(shè)計</p><p>  本次程序設(shè)計共調(diào)用了12個方法分別是:</p><p>  InitNumStack,ParseInt,PushNum,PopNum ,InitCalStack,PopCal ,PushCal,In,GetTopCal,GetTopNum,Preced,Operate。</p><p><b&

8、gt;  其中</b></p><p>  ParseInt方法</p><p>  int ParseInt(char c[]){</p><p>  int number[5],i;</p><p>  for(i=0;i<5;i++){</p><p>  number[i]=(int)(c[i

9、])-48;</p><p><b>  }</b></p><p>  i=10000*number[0]+1000*number[1]+100*number[2]+10*number[3]+number[4];</p><p><b>  return i;</b></p><p><b&

10、gt;  }</b></p><p>  為將輸入的數(shù)字字符型轉(zhuǎn)換為整型的轉(zhuǎn)換函數(shù),通過Ascall表的轉(zhuǎn)換關(guān)系,將輸入的字符型數(shù)字轉(zhuǎn)換為整型。在入棧前進(jìn)行此方法,以便整型數(shù)的計算。</p><p>  Preced,Operate函數(shù)</p><p>  char Preced(char a , char b){</p><p>

11、;  char c[7]={'+','-','*','/','(',')','#'};</p><p>  char d[7][7]={</p><p>  {'>','>','<','<',

12、'<','>','>'},</p><p>  {'>','>','<','<','<','>','>'},</p><p>  {'>','

13、>','>','>','<','>','>'},</p><p>  {'>','>','>','>','<','>','>'},<

14、/p><p>  {'<','<','<','<','<','=',' '},</p><p>  {'>','>','>','>',' ','

15、;>','>'},</p><p>  {'<','<','<','<','<',' ','='},</p><p><b>  };</b></p><p>  in

16、t Operate (int a,char theta,int b){</p><p><b>  int c ;</b></p><p>  if (theta=='+'){</p><p><b>  c=a+b;</b></p><p><b>  return c;

17、</b></p><p><b>  }</b></p><p>  if (theta=='-'){</p><p><b>  c=a-b;</b></p><p><b>  return c;</b></p><p>

18、<b>  }</b></p><p>  if (theta=='*'){</p><p><b>  c=a*b;</b></p><p><b>  return c;</b></p><p><b>  }</b></p>

19、;<p>  if (theta=='/'){</p><p><b>  c=a/b;</b></p><p><b>  return c;</b></p><p><b>  }</b></p><p><b>  return 0

20、;</b></p><p><b>  }</b></p><p>  其中preced是判定運算符棧的棧頂運算符C1與讀入的運算符C2之間優(yōu)先關(guān)系函數(shù);Opearte為進(jìn)行二元運算aCb的函數(shù),如果是編譯表達(dá)式,則產(chǎn)生這個運算的一組相應(yīng)的指令并返回存放結(jié)果的中間變量名;如果是解釋執(zhí)行表達(dá)式,則直接進(jìn)行該運算,并返回運算結(jié)果。</p><

21、;p>  五,程序源代碼以及運行結(jié)果</p><p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  #include<string.h></p><p>  typedef struct{</p><p>

22、  int *base;</p><p><b>  int *top;</b></p><p>  int Stacksize;</p><p><b>  }SqlNum;</b></p><p>  void InitNumStack(SqlNum &S){</p>&l

23、t;p>  S.base=(int *)malloci(100*sizeof(int));</p><p>  S.top=S.base;</p><p>  S.Stacksize=100;</p><p><b>  }</b></p><p>  int ParseInt(char c[]){</p&g

24、t;<p>  int number[5],i;</p><p>  for(i=0;i<5;i++){</p><p>  number[i]=(int)(c[i])-48;</p><p><b>  }</b></p><p>  i=10000*number[0]+1000*number[1]

25、+100*number[2]+10*number[3]+number[4];</p><p><b>  return i;</b></p><p><b>  }</b></p><p>  void PushNum(SqlNum &S,int c){</p><p><b> 

26、 *S.top=c;</b></p><p><b>  S.top++;</b></p><p><b>  }</b></p><p>  int PopNum(SqlNum &S){</p><p><b>  int c;</b></p>

27、<p><b>  S.top--;</b></p><p><b>  c=*S.top;</b></p><p><b>  return c;</b></p><p><b>  }</b></p><p>  typedef stru

28、ct{</p><p>  char *base;</p><p>  char *top;</p><p>  int Stacksize;</p><p><b>  }SqlCal;</b></p><p>  void InitCalStack(SqlCal &S){</p&

29、gt;<p>  S.base=(char *)malloc(100*sizeof(char));</p><p>  S.top=S.base;</p><p>  S.Stacksize=100;</p><p><b>  }</b></p><p>  void PushCal(SqlCal &am

30、p;S,char c){</p><p><b>  *S.top=c;</b></p><p><b>  S.top++;</b></p><p><b>  }</b></p><p>  char PopCal(SqlCal &S){</p>&l

31、t;p><b>  char c;</b></p><p><b>  S.top--;</b></p><p><b>  c=*S.top;</b></p><p><b>  return c;</b></p><p><b>  }

32、</b></p><p>  int In(char c,char s[]){</p><p><b>  int i;</b></p><p>  for(i=0;i<strlen(s);i++)</p><p>  if(c==s[i])</p><p><b> 

33、 return 1;</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  char GetTopCal(SqlCal &s){</p><p><b>  char c;</b><

34、/p><p>  c=*(s.top-1);</p><p><b>  return c;</b></p><p><b>  }</b></p><p>  int GetTopNum(SqlNum &s){</p><p><b>  int c;<

35、/b></p><p>  c=*(s.top-1);</p><p><b>  return c;</b></p><p><b>  }</b></p><p>  char Preced(char a , char b){</p><p>  char c[7]

36、={'+','-','*','/','(',')','#'};</p><p>  char d[7][7]={</p><p>  {'>','>','<','<','<

37、9;,'>','>'},</p><p>  {'>','>','<','<','<','>','>'},</p><p>  {'>','>',&#

38、39;>','>','<','>','>'},</p><p>  {'>','>','>','>','<','>','>'},</p><

39、p>  {'<','<','<','<','<','=',' '},</p><p>  {'>','>','>','>',' ','>',&

40、#39;>'},</p><p>  {'<','<','<','<','<',' ','='},</p><p><b>  };</b></p><p>  if(a=='+&#

41、39;){</p><p>  if(b=='+'){</p><p>  return d[0][0];}</p><p>  if(b=='-'){</p><p>  return d[0][1];}</p><p>  if(b=='*'){</p>

42、<p>  return d[0][2];}</p><p>  if(b=='/'){</p><p>  return d[0][3];}</p><p>  if(b=='('){</p><p>  return d[0][4];}</p><p>  if(b==&

43、#39;)'){</p><p>  return d[0][5];}</p><p>  if(b=='#'){</p><p>  return d[0][6];}</p><p><b>  }</b></p><p>  if(a=='-'){<

44、;/p><p>  if(b=='+'){</p><p>  return d[1][0];}</p><p>  if(b=='-'){</p><p>  return d[1][1];}</p><p>  if(b=='*'){</p><p&g

45、t;  return d[1][2];}</p><p>  if(b=='/'){</p><p>  return d[1][3];}</p><p>  if(b=='('){</p><p>  return d[1][4];}</p><p>  if(b==')

46、9;){</p><p>  return d[1][5];}</p><p>  if(b=='#'){</p><p>  return d[1][6];}</p><p><b>  }</b></p><p>  if(a=='*'){</p>

47、<p>  if(b=='+'){</p><p>  return d[2][0];}</p><p>  if(b=='-'){</p><p>  return d[2][1];}</p><p>  if(b=='*'){</p><p>  retu

48、rn d[2][2];}</p><p>  if(b=='/'){</p><p>  return d[2][3];}</p><p>  if(b=='('){</p><p>  return d[2][4];}</p><p>  if(b==')'){<

49、/p><p>  return d[2][5];}</p><p>  if(b=='#'){</p><p>  return d[2][6];}</p><p><b>  }</b></p><p>  if(a=='/'){</p><p&g

50、t;  if(b=='+'){</p><p>  return d[3][0];}</p><p>  if(b=='-'){</p><p>  return d[3][1];}</p><p>  if(b=='*'){</p><p>  return d[3][

51、2];}</p><p>  if(b=='/'){</p><p>  return d[3][3];}</p><p>  if(b=='('){</p><p>  return d[3][4];}</p><p>  if(b==')'){</p>

52、<p>  return d[3][5];}</p><p>  if(b=='#'){</p><p>  return d[3][6];}</p><p><b>  }</b></p><p>  if(a=='('){</p><p>  if(b

53、=='+'){</p><p>  return d[4][0];}</p><p>  if(b=='-'){</p><p>  return d[4][1];}</p><p>  if(b=='*'){</p><p>  return d[4][2];}<

54、/p><p>  if(b=='/'){</p><p>  return d[4][3];}</p><p>  if(b=='('){</p><p>  return d[4][4];}</p><p>  if(b==')'){</p><p>

55、;  return d[4][5];}</p><p>  if(b=='#'){</p><p>  return d[4][6];}</p><p><b>  }</b></p><p>  if(a==')'){</p><p>  if(b=='+

56、'){</p><p>  return d[5][0];}</p><p>  if(b=='-'){</p><p>  return d[5][1];}</p><p>  if(b=='*'){</p><p>  return d[5][2];}</p>

57、<p>  if(b=='/'){</p><p>  return d[5][3];}</p><p>  if(b=='('){</p><p>  return d[5][4];}</p><p>  if(b==')'){</p><p>  retur

58、n d[5][5];}</p><p>  if(b=='#'){</p><p>  return d[5][6];}</p><p><b>  }</b></p><p>  if(a=='#'){</p><p>  if(b=='+'){&

59、lt;/p><p>  return d[6][0];}</p><p>  if(b=='-'){</p><p>  return d[6][1];}</p><p>  if(b=='*'){</p><p>  return d[6][2];}</p><p>

60、;  if(b=='/'){</p><p>  return d[6][3];}</p><p>  if(b=='('){</p><p>  return d[6][4];}</p><p>  if(b==')'){</p><p>  return d[6][5

61、];}</p><p>  if(b=='#'){</p><p>  return d[6][6];}</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b>

62、;</p><p>  int Operate (int a,char theta,int b){</p><p><b>  int c ;</b></p><p>  if (theta=='+'){</p><p><b>  c=a+b;</b></p><

63、;p><b>  return c;</b></p><p><b>  }</b></p><p>  if (theta=='-'){</p><p><b>  c=a-b;</b></p><p><b>  return c;</

64、b></p><p><b>  }</b></p><p>  if (theta=='*'){</p><p><b>  c=a*b;</b></p><p><b>  return c;</b></p><p><b

65、>  }</b></p><p>  if (theta=='/'){</p><p><b>  c=a/b;</b></p><p><b>  return c;</b></p><p><b>  }</b></p>&l

66、t;p><b>  return 0;</b></p><p><b>  }</b></p><p>  void main(){</p><p>  SqlCal OPTR; SqlNum OPND;</p><p>  char c,d[5]={'0','0

67、9;,'0','0','0'};</p><p><b>  int f=0;</b></p><p>  char op[]={'+','-','*','/','(',')','#'};</p>

68、<p>  InitCalStack(OPTR);</p><p>  InitNumStack(OPND);</p><p>  printf("請輸入算式并在尾部添加一個#號\n");</p><p>  c=getchar();</p><p>  PushCal(OPTR,'#');&l

69、t;/p><p>  while(c!='#'||GetTopCal(OPTR)!='#')</p><p><b>  {</b></p><p>  if (!In(c,op))</p><p><b>  {</b></p><p>  d[

70、0]=d[1];</p><p>  d[1]=d[2];</p><p>  d[2]=d[3];</p><p>  d[3]=d[4];</p><p><b>  d[4]=c;</b></p><p>  c=getchar();</p><p><b>

71、;  f=1;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  if(f==1){</b></p><p>

72、;  PushNum(OPND,ParseInt(d));</p><p>  d[0]='0';d[1]='0';d[2]='0';d[3]='0';d[4]='0';</p><p><b>  f=0;</b></p><p><b>  }<

73、/b></p><p>  switch(Preced(GetTopCal(OPTR),c))</p><p><b>  {</b></p><p><b>  case'<':</b></p><p>  PushCal(OPTR,c);</p><

74、;p>  c=getchar();</p><p><b>  break;</b></p><p><b>  case'=':</b></p><p>  PopCal(OPTR);</p><p>  c=getchar();</p><p>&l

75、t;b>  break;</b></p><p><b>  case'>':</b></p><p>  char theta;int a;int b;</p><p>  theta=PopCal(OPTR);</p><p>  b=PopNum(OPND);</p&g

76、t;<p>  a=PopNum(OPND);</p><p>  PushNum(OPND,Operate(a,theta,b));</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b>

77、</p><p><b>  }</b></p><p>  printf("%d\n",GetTopNum(OPND));</p><p><b>  }</b></p><p><b>  程序運行結(jié)果:</b></p><p>

溫馨提示

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

最新文檔

評論

0/150

提交評論