實驗三實驗報告.doc_第1頁
實驗三實驗報告.doc_第2頁
實驗三實驗報告.doc_第3頁
實驗三實驗報告.doc_第4頁
實驗三實驗報告.doc_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗三實驗報告1120131317 周任然1、簡易計算器(1)問題描述由鍵盤輸入一算術(shù)表達式,以中綴形式輸入,試編寫程序?qū)⒅芯Y表達式轉(zhuǎn)換成一棵二叉表達式樹,通過對該的后序遍歷求出計算表達式的值。(2)基本要求 a要求對輸入的表達式能判斷出是否合法。不合法要有錯誤提示信息。b將中綴表達式轉(zhuǎn)換成二叉表達式樹。c后序遍歷求出表達式的值(3)數(shù)據(jù)結(jié)構(gòu)與算法分析一棵表達式樹,它的樹葉是操作數(shù),如常量或變量名字,而其他的結(jié)點為操作符。a建立表達式樹。二叉樹的存儲可以用順序存儲也可用鏈式存儲。當(dāng)要創(chuàng)建二叉樹時,先從表達式尾部向前搜索,找到第一個優(yōu)先級最低的運算符,建立以這個運算符為數(shù)據(jù)元素的根結(jié)點。注意到表達式中此運算符的左邊部分對應(yīng)的二叉绔為根結(jié)點的左子樹,右邊部分對應(yīng)的是二叉绔為根結(jié)點的右子樹,根據(jù)地這一點,可用遞歸調(diào)用自己來完成對左右子樹的構(gòu)造。b求表達式的值。求值時同樣可以采用遞歸的思想,對表達式進行后序遍歷。先遞歸調(diào)用自己計算左子樹所代表的表達式的值,再遞歸調(diào)用自己計算右子樹代表的表達式的值,最后讀取根結(jié)點中的運算符,以剛才得到的左右子樹的結(jié)果作為操作數(shù)加以計算,得到最終結(jié)果。(4)需求分析程序運行后顯示提示信息,輸入任意四則運算表達式,倘若所輸入的表達式不合法程序?qū)箦e。輸入四則運算表達式完畢,程序?qū)⑤敵鲞\算結(jié)果。測試用的表達式須是由+、-、*、/運算符,括號“(”、“)”與相應(yīng)的運算數(shù)組成。運算數(shù)可以是無符號浮點型或整型,范圍在065535。(5)概要設(shè)計二叉樹的抽象數(shù)據(jù)類型定義ADT BinaryTree 數(shù)據(jù)對象:表達式運算數(shù) num | 0 num 65535 表達式運算符 opr | + , - , * , / 數(shù)據(jù)關(guān)系:由一個根結(jié)點和兩棵互不相交的左右子樹構(gòu)成,且樹中結(jié)點具有層次關(guān)系。根結(jié)點必須為運算符,葉子結(jié)點必須為運算數(shù)。基本操作: InitBiTree(&T , &S) 初始條件:存在一四則運算前綴表達式S。 操作結(jié)果:根據(jù)前綴表達式S構(gòu)造相應(yīng)的二叉樹T。 DestroyBiTree(&T) 初始條件:二叉樹T已經(jīng)存在。 操作結(jié)果:銷毀T。 Value(&T) 初始條件:二叉樹T已經(jīng)存在。 操作結(jié)果:計算出T所表示的四則運算表達式的值并返回。ADT BineryTree順序棧的抽象數(shù)據(jù)類型定義ADT Stack 數(shù)據(jù)對象:具有相同類型及后進先出特性的數(shù)據(jù)元素集合。 數(shù)據(jù)關(guān)系:相鄰數(shù)據(jù)元素具有前去和后繼關(guān)系。 基本操作: InitStack(&S) 初始條件:無 操作結(jié)果:構(gòu)造一個空棧S。 DestroyStack(&S) 初始條件:棧S已經(jīng)存在。 操作結(jié)果:銷毀S。 StackLength(&S) 初始條件:棧S已經(jīng)存在。 操作結(jié)果:返回S中元素個數(shù)。 GetTop(S , &e) 初始條件:棧S已經(jīng)存在且非空。 操作結(jié)果:用e返回S的棧頂元素。 Push(&S , e) 初始條件:棧S已經(jīng)存在。 操作結(jié)果:插入元素e為S的新棧頂元素。 Pop(&S , e) 初始條件:棧S已經(jīng)存在且非空。 操作結(jié)果:刪除S的棧頂元素,并用e返回其值。ADT Stack字符串的抽象數(shù)據(jù)類型定義ADT String 數(shù)據(jù)對象:具有字符類型的數(shù)據(jù)元素集合。 數(shù)據(jù)關(guān)系:相鄰數(shù)據(jù)元素具有前驅(qū)和后繼關(guān)系。 基本操作: StrLength(S) 初始條件:串S已經(jīng)存在。 操作結(jié)果:返回S的元素個數(shù)。 StrNeg(S , F) 初始條件:串S已經(jīng)存在且非空。 操作結(jié)果:求S的逆序并將結(jié)果保存在串F中。ADT String本程序包含四個模塊:主程序模塊;二叉樹單元模塊(實現(xiàn)二叉樹的抽象數(shù)據(jù)類型,包括結(jié)點和指針的定義);順序棧單元模塊(實現(xiàn)順序棧的抽象數(shù)據(jù)類型,包含結(jié)點和指針的定義);字符串單元模塊(實現(xiàn)字符串的抽象數(shù)據(jù)類型)。四個模塊之間調(diào)用關(guān)系為主程序模塊二叉樹模塊,二叉樹模塊調(diào)用順序棧模塊。詳細設(shè)計順序棧類型。#define Stack_Size 100typedef struct char elemStack_Size; int top;SqStack 基本操作實現(xiàn)的偽代碼算法如下: void InitStack (SqStack &S) /初始化順序棧 S.elem=new ElemTypeStack_Size; if(!S.elem) Error(Overflow!); S.top=-1; viod Push (SqStack &S,char c) /順序棧壓棧 if(S.top=(Stack_Size-1) Error(Stack Overflow!); S.elem+S.top=c; ElemType Pop (SqStack &S) /順序棧出棧 if(S.top=-1) Error(Stack Empty!); return S.elemS.top-; int StackLength(SqStack &S) /求順序棧長度 return (S.top+1); GetTop(SqStack &S ,char e) /取棧頂元素 e=S.elemtop; 字符串類型typedef struct /動態(tài)順序串 char *ch; int length;String基本操作實現(xiàn)的偽代碼算法如下:int StrLength(&S) /求串長 return S.length; void StrNeg(&S , &F) /求逆序串if(!S.length) error(“String Empty!”); for(i=0 ; i=0 ; i-) /對輸入串逆序掃描 if(Str.chi=48&Str.chi=Precedence( GetTop(S) ) ) Push( S , Str.chi ); break; else Pop(S , e); Output.chi=e; Output.length+; if( Str.chi=( ) /假如是左括號,棧中運算符逐個出棧并輸出,直到遇到右括號。右括號出棧并丟棄。 while( GetTop(S)!=) ) Output.chi=Pop(S); Output.length+; while(S.top!=-1) /假如輸入完畢,棧中剩余的所有操作符出棧并加到輸出串中。 Output.ch=Output.ch-; Output.ch=Pop(S); return output;void CreatBiTree(&T , &S) /由中綴表達式生成表達式二叉樹 String F; SqStack Sq; /用以存放生成的二叉樹結(jié)點 InitStack(Sq); F=Convert(S); /求得S的前綴表達式 for(i=F.length-1 ; i=0 ; i-) If( !IsOperator(F.chi) ) T=new TNode; T-data=F.chi; T-lchild=NULL; T-rchild=NULL; Push(Sq , T) else T=new TNode; T-data=F.chi; T-lchild=Pop( Sq ); T-rchild=Pop( Sq ); Push(Sq , T); int Calc(int a, char opr, int b) /計算 switch (opr) case +: return a + b; case -: return a - b; case *: return a * b; case /: return a / b; int Value(TNode *T) if (T-lchild = NULL &T-rchild = NULL) return T-data; else return Calc( Value(T-lchild) , T-data , Value(T-rchild) );主函數(shù)偽碼算法。void main() Face(); /輸出界面及相關(guān)信息 do cout”Please input an expression:”Str; JudgeExp(S); /判斷輸入的表達式是否合法。 T=CreatBiTree(S);N=Value(T); cout”The value of this expression is”Nendl;coute; if(e=y) flag=1;else flag=0; while(flag) /main測試結(jié)果附錄(帶注釋的源程序)/*CStack.h*/#includeusing namespace std;#define Stack_Size 100typedef struct /字符類型順序棧 char elemStack_Size; int top;CStackvoid InitCStack(&S) /初始化順序棧 S.elem=new charStack_Size; if(!S.elem) Error(Overflow!); S.top=-1;void Push_C(CStack &S , char e) /壓棧 if( S.top=(Stack_Size-1) ) Error(Stack Overflow!); S.elem+S.top=e;char Pop_C(CStack &S) /出棧 if(S.top=-1) Error(Stack Empty!); return S.elemtop-;char GetTop(&S) /取棧頂元素 if(S.top=-1) Error(Stack Empty!); return S.elemtop;int CStackLength(&S) /求棧中元素個數(shù) return top+1;/*TStack.h*/#include#includeTree.husing namespace std;#define Stack_Size 100typedef struct /二叉樹結(jié)點類型順序棧 TNode elemStack_Size; int top;TStackvoid InitTStack(&S) /初始化順序棧 S.elem=new charStack_Size; if(!S.elem) Error(Overflow!); S.top=-1;void Push_T(TStack &S , TNode T) /壓棧 if( S.top=(Stack_Size-1) ) Error(Stack Overflow!); S.elem+S.top=T;TNode Pop_T(TStack &S) /出棧 if(S.top=-1) Error(Stack Empty!); return S.elemtop-;/*String.h*/#includeusing namespace std;typedef struct /動態(tài)順序串 char *ch; int len;StringSrting StrNeg(&Str) /求逆序串 String F; for(i=0 ; ilength ; i+) F.chi = Str.chStr.len-1-i; return Fint StrLen(&Str) /求串長 int i; for(i=0 ; Str.chi!=0 ; ) i+; return i;/*Tree.h*/#include#includeString.h#includeCStack.h#includeTStack.husing namespace std;typedef struct /二叉樹結(jié)點 union data /數(shù)據(jù)域 char opr; /運算符 int opn; /運算數(shù) struct TNode *lchid , *rchild; /指針域TNodetypedef TNode *BiTree; /二叉樹頭結(jié)點int Precedence(char opr) /判斷運算符級別函數(shù);其中* /的級別為2,+ -的級別為1; switch(opr) case+: case-: return 1; break; case*: case/: return 2; break; case(: case): case#: default: return 0; break; bool IsOperator(char opr) /判斷輸入串中的字符是不是合法操作符 if(op=+|op=-|op=*|op=/) return true; else return false;String Convert(String &Str) /將一個中綴串轉(zhuǎn)換為后綴串 int i; String Output; /輸出串 Output.len=0; CStack S; InitCStack(S); Str.len=StrLen(Str); /求的輸入的串長 for(i=Str.len-1 ; i=0 ; i-) /對輸入串逆序掃描 if(Str.chi=48 & Str.chi=Precedence( GetTop(S) ) ) Push_C( S , Str.chi ); break; else Output.chStr.len-1-i=Pop_C(S); Output.len+; if( Str.chi=( ) /假如是左括號,棧中運算符逐個出棧并輸出 /直到遇到右括號。右括號出棧并丟棄。 while( GetTop(S)!=) ) Output.chStr.len-1-i=Pop_C(S); Output.len+; while(S.top!=-1) /假如輸入完畢,棧中剩余的所有操作符出棧并加到輸出串中。 Output.ch+Output.len-1=Pop_C(S); return StrNeg(Output); /輸出Output的逆序即為所求前綴表達式void CreatBiTree(&T , &Str) /由中綴表達式生成表達式二叉樹 String F; TStack S; /用以存放生成的二叉樹結(jié)點 InitTStack(S); F=Convert(Str); /求得S的前綴表達式 for(i=F.len-1 ; i=0 ; i-) if( !IsOperator(F.chi) ) T=new TNode; T-data=F.chi; T-lchild=NULL; T-rchild=NULL; Push_T(S , T) else T=new TNode; T-data=F.chi; T-lchild=Pop_T( S ); T-rchild=Pop_T( S ); Push_T(S , T); int Calc(int a, char opr, int b) /計算 switch (opr) case +: return a + b; case -: return a - b; case *: return a * b; case /: return a / b; int Value(TNode *T) /求表達式二叉樹的值 if (T-lchild = NULL &T-rchild = NULL) return T-data; else return Calc( Value(T-lchild) , T-data , Value(T-rchild) );/*JudgeExp.h*/#include#includeString.h#includeTree.husing namespace std;bool JudegExp(String Exp) /此函數(shù)驗證式子是否正確,即是否符合運算規(guī)則。 char check; int error=0; int lb=0; int rb=0; if(StrLen(Exp)=1 & Exp.ch0!=-) return false; else if( (IsOperator(Exp.ch0)& Exp.ch0!=- | IsOperator( Exp.chStrLen(Exp)-1 ) ) & Exp.ch0!=( & Exp.chStrLen(Exp)-1!=) ) /此處若不加,在遇到某些式子時,會出現(xiàn)非法操作。 return false; for(int m=0 ; mStrLen(Exp) ; m+) check=Exp.chm; if(m=0 & check=- & (IsDigit(Exp.ch1)!=0 | Exp.ch1=( ) ) check=Exp.ch+m; if( IsOperand(check) ); /如果是數(shù)字,跳過,不管。 else if(IsOperator(check) if( check=) ) rb+; if( IsOperator(Exp.chm+1)&(Exp.chm+1=+|Exp.chm+1=-|Exp.chm+1=*|Exp.chm+1=/|Exp.chm+1=|Exp.chm+1=) ) ) m+; if( Exp.chm=) ) rb+; else if( IsOperator(

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論