




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告棧的應(yīng)丿:表達式求值的設(shè)計徐燕萍學(xué)生姓名指導(dǎo)教師 完成日期目錄1設(shè)計內(nèi)容2 設(shè)計分析2.1系統(tǒng)需求分析2.1.1系統(tǒng)目標(biāo)2.1.2主體功能2.2系統(tǒng)概要設(shè)計2.2.1系統(tǒng)的功能模塊劃分 2.2.2系統(tǒng)流程圖3 設(shè)計實踐基本分析 中綴表達式求值 后綴表達式求值 中綴表達式轉(zhuǎn)換成后綴表達式3.13.23.33.44 測試方法4.1 基本測試 4.2 拓展測試 4.3 容錯測試 5 程序運行效果 6 設(shè)計心得 7 附錄:源代碼 .1.1.1.11.12.3.4.5.6.7.7.8.7.8.10棧的應(yīng)用:表達式求值的設(shè)計1 設(shè)計內(nèi)容設(shè)計一個表達式求值的程序。 該程序必須可以接受包含
2、 (,),+,- * , /, %和八(求幕運算符,a八b=ab)的中綴表達式,并求出結(jié)果。如 果表達式正確,則輸出表達式的結(jié)果;如果表達式非法,則輸出錯誤信 息。2 設(shè)計分析2.1 系統(tǒng)需求分析2.1.1 系統(tǒng)目標(biāo) 利用棧設(shè)計一個程序,該程序能夠用于表達式求值,程序?qū)⒆x入的 中綴表達式轉(zhuǎn)換為后綴表達式,然后讀取后綴表達式,輸出結(jié)果。輸入要求:程序從“ input.txt ”文件中讀取信息,在這個文件中 如果有多個中綴表達式,則每個表達式獨占一行,程序的讀取操作在文 件的結(jié)尾處停止。輸出要求:對于每一個表達式,將其結(jié)果放在“ output.txt ”文件 的每一行中。這些結(jié)果可能是值(精確到小
3、數(shù)點后兩位) ,也可能是錯 誤信息“ ERROR IN INFIX NOTATIO”N。2.1.2 主體功能 能夠處理以字符序列的形式輸入的不含變量的實數(shù)表達式,正確處 理負(fù)數(shù)與小數(shù), 判斷表達式是否語法正確 (包含分母不能為零的情況) , 正確實現(xiàn)對算術(shù)四則混合運算表達式的求值, 能夠?qū)⒂嬎阒杏龅降膯栴} 和結(jié)果以文件的形式予以存儲。2.2 系統(tǒng)概要設(shè)計2.2.1 系統(tǒng)的功能模塊劃分1. 判斷操作數(shù)的函數(shù) isnum()判斷當(dāng)前所指字符是否屬于數(shù)字, 是就返回1',不是就返回 0'。2. 求運算符優(yōu)先級函數(shù) priority()為了方便判斷運算符優(yōu)先級, 先利用 switch
4、函數(shù)將不同的運算符返 回不同的整型數(shù)字,在根據(jù)數(shù)字的大小判斷優(yōu)先級。 +',- '優(yōu)先級 相同,返回數(shù)字相同 ,*',/ '也是。3. 表達式求值函數(shù) infix_value() 此函數(shù)是直接按照設(shè)計思路完成問題要求的函數(shù),其中要調(diào)用到判 斷操作符的函數(shù) isnum() 和求運算符優(yōu)先級的函數(shù) priority() 。循環(huán)結(jié) 束彈出棧 2 的數(shù)值,并返回。4. 主函數(shù) main() 定義一個數(shù)組存儲表達式整個字符串,將返回的數(shù)值直接賦值到浮 點型的 result ,輸出 result 。5. 兩個棧的函數(shù)設(shè)計:棧的初始化函數(shù) charInit_SeqStack(
5、)Init_SeqStack()棧判空 Empty_SeqStack()char Empty_SeqStack()入棧函數(shù) Push_SeqStack()charPush_SeqStack()出棧函數(shù) Pop_SeqStack()charPop_SeqStack()取棧頂函數(shù) GetTop_SeqStack()charGetTop_SeqStack()銷毀棧 Destory_SeqStack()charDestory_SeqStack()2.2.2 系統(tǒng)流程圖存放操作字符開始優(yōu)先級比較算法建立棧zOp erate 算法計算1r存放數(shù)據(jù)Ui否合法yf輸出錯誤提輸出表達是值示表達式是結(jié)束圖1系統(tǒng)流
6、程圖3.1基本分析算術(shù)表達式的計算往往是通過使用棧來實現(xiàn)的。 所以,可以使用棧來存儲輸入在計算機中,本表達式求值程序的最主要的數(shù)據(jù)結(jié)構(gòu)就是棧。 表達式的操作符和操作數(shù)。輸入的表達式是由操作數(shù)和運算符以及改變運算次序的圓括號連 接而成的式子。表達式求值是高級語言編譯中的一個基本問題,是棧的典型應(yīng)用實例。任何一個表達式都是由操作數(shù)(op era nd)、運算符(op erator)和界 限符(delimiter) 組成的。操作數(shù)既可以是常數(shù),也可以是被說明為變 量或常量的標(biāo)識符;運算符可以分為算術(shù)運算符、關(guān)系運算符和邏輯運 算符三類;基本界限符有左右括號和表達式結(jié)束符等。3.2中綴表達式求值#。要
7、對一即:中綴表達式:每個二目運算符在兩個運算量的中間,假設(shè)操作數(shù)是 整型常數(shù),運算符只含加、減、乘、除等四種運算符,界限符有左右括 號和表達式起始、結(jié)束符“#”, 口: #(7+15)*(23-28/4)個簡單的算術(shù)表達式求值,首先要了解算術(shù)四則運算的規(guī)則,(1)從左到右;先乘除,后加減; 先括號內(nèi),后括號外。OPS根據(jù)1運算符和界限符可統(tǒng)稱為算符,它們構(gòu)成的集合命名為 上述三條運算規(guī)則,在運算過程中,任意兩個前后相繼出現(xiàn)的算符0 和0 2之間的優(yōu)先關(guān)系必為下面三種關(guān)系之一: 0 1<0 2,0 1的優(yōu)先權(quán)低于0 2。0 1=0 2,0 1的優(yōu)先權(quán)等于0 2 0 1>0 2,0 1
8、的優(yōu)先權(quán)高于0 2實現(xiàn)算符優(yōu)先算法時需要使用兩個工作棧:一個稱作operator ,用 以存放運算符;另一個稱作operand,用以存放操作數(shù)或運算的中間結(jié) 果。算法的基本過程如下:首先初始化操作數(shù)棧operand和運算符棧operator ,并將表達式起 始符“#”壓入運算符棧;依次讀入表達式中的每個字符,若是操作數(shù)則直接進入操作數(shù)棧 operand,若是運算符,則與運算符棧operator的棧頂運算符進行優(yōu)先 權(quán)比較,并做如下處理:(1) 若棧頂運算符的優(yōu)先級低于剛讀入的運算符,則讓剛讀入的運算符進operator棧;(2) 若棧頂運算符的優(yōu)先級高于剛讀入的運算符,則將棧頂運算符a、退棧,
9、送入0,同時將操作數(shù)棧operand退棧兩次,得到兩個操作數(shù)b,對a、b進行0運算后,將運算結(jié)果作為中間結(jié)果推入operand棧;說明 棧的 與表(3) 若棧頂運算符的優(yōu)先級與剛讀入的運算符的優(yōu)先級相同,左右括號相遇,只需將棧頂運算符(左括號)退棧即可。op erator棧頂元素和當(dāng)前讀入的字符均為“ #”時,說明表達式起始符“ #” 達式結(jié)束符“ #”相遇,整個表達式求解結(jié)束。int Exp Evaluati on()*/ /*讀入一個簡單算術(shù)表達式并計算其值。In itStack (&operan d);In itStack(&op erator);PushStack(&a
10、mp;operator,'#'););printf( nn Please input an expression (Ending with #)ch=getchar();/*讀入表達式中的一個字符*/while(ch!二 #' |GetTop(operator)!二#') if(!In(ch, OPS)/* 判斷 ch 是否運算符 */ a=GetNumber(&ch); /*用ch逐個讀入操作數(shù)的各位數(shù)碼,并轉(zhuǎn)化為十進制數(shù)a */Pu shStack (&operan d,a);elseswitch(Co mp are(GetT op(op e
11、rator),ch)case' < :Pu shStack(&op erator,ch);ch=getchar();break;case 二:Po p6tack(&op erator, &x);ch=getchar();break;case > :Pop Stack (&op erator,&op);Pop Stack(&op era nd, & b);Pop Stack (&op era nd, & a); v=Execute(a, op ,b);P ushStack (&operan d,v
12、);break;v=GetT op(operan d);return(v);為了處理方便,編譯程序常把中綴表達式首先轉(zhuǎn)換成等價的后綴表 達式,后綴表達式的運算符在運算對象之后。在后綴表達式中,不再引 入括號,所有的計算按運算符出現(xiàn)的順序,嚴(yán)格從左向右進行,而不用 再考慮運算規(guī)則和級別。中綴表達式“(a+b*c)-d/e ”的后綴表達式 為:“ abc*+de/ - ”。3.3后綴表達式求值計算一個后綴表達式,算法上比計算一個中綴表達式簡單的多。這 是因為表達式中即無括號又無優(yōu)先級的約束。具體做法:只使用一個對 象棧,當(dāng)從左向右掃描表達式時,每遇到一個操作數(shù)就送入棧中保存, 每遇到一個運算符就從
13、棧中取出兩個操作數(shù)進行當(dāng)前的計算,然后把結(jié)果再入棧,直到整個表達式結(jié)束,這時送入棧頂?shù)闹稻褪墙Y(jié)果。下面是后綴表達式求值的算法,在下面的算法中假設(shè),每個表達式是合乎語法的,并且假設(shè)后綴表達式已被存入一個足夠大的字符數(shù)組A中,且以 #'為結(jié)束字符,為了簡化問題,限定運算數(shù)的位數(shù)僅為一位且忽略了數(shù)字字符串與相對應(yīng)的數(shù)據(jù)之間的轉(zhuǎn)換問題。double calcul_exp(char *A) /* 本函數(shù)返回由后綴表達式 A 表示的表 達式運算結(jié)果 */ SeqStarck s;ch=*A+ ; InitStack(s);while(ch!= '#' ) if(ch!= 運算符 )
14、 PushStack(s, ch);else取出兩個運算量 */: c=a+b; break ; : c=a-b; break ; : c=a*b; break ; PopStack(s, &a); PopStack(s, &b); /* switch(ch) case ch= ' + case ch= 'case ch= '*case ch= '/ ': c=a/b; break ; case ch= '%': c=a%b; break ;PushStack (s, c) ;ch=*A+ ;PopStack(s, res
15、ult) ;return result ;3.4 中綴表達式轉(zhuǎn)換成后綴表達式 將中綴表達式轉(zhuǎn)化為后綴表達式和前述對中綴表達式求值的方法 完全類似,但只需要運算符棧,遇到運算對象時直接放后綴表達式的存 儲區(qū),假設(shè)中綴表達式本身合法且在字符數(shù)組 A 中,轉(zhuǎn)換后的后綴表達 式存儲在字符數(shù)組 B 中。具體做法:遇到運算對象順序向存儲后綴表達 式的B數(shù)組中存放,遇到運算符時類似于中綴表達式求值時對運算符的 處理過程,但運算符出棧后不是進行相應(yīng)的運算,而是將其送入B中存放。讀者不難寫出算法,在此不在贅述。程序的整體算法分兩步:第一步,從 ”input.txt ”文件中讀取中綴表達式,并應(yīng)用運算符棧OpHo
16、lder把中綴表達式轉(zhuǎn)換為后綴表達式,將輸出結(jié)果存放在一個temp 文件中。第二步,從temp文件中讀取中綴表達式,并應(yīng)用操作棧 Operands計算后綴表達式結(jié)果,將結(jié)果輸出到”out pu t.txt ”文件中。4測試方法設(shè)計針對程序的input.txt文件,并將運行結(jié)果與期望測試進行比較。5程序運行效果 5.1基本測試:2:則輸出結(jié)果如下圖3:在input文件中輸入表達式如下圖r Output, tit -記審本文件®編輯(I)格式辺查看電) 幫助匹|3.001*2+3-111 + 222*3曠 2.丁 3(2-4>3武八數(shù)據(jù)結(jié)構(gòu)深程設(shè)計'春達式求值辺Ebu叭表達
17、式求值"富HEI PMess any key ta continue圖45.2擴展測試:在input文件中輸入表達式如下圖5:則輸出結(jié)果如下圖6:C input-tHt - 記事本C Output-tHt -記事本匚回區(qū)文件疋褊輯屯)箱式見)查看如 幫肪妁2-5-3. V21*2(2.5)*(3-2)+5.6-19832"(1+1)1 + 2+31*2 *3(1 + 2J*34Uf(54l*ii*3.2fi37-缶了 *82.9*1 .24-0.5-1|%3/2*1*(5-5) 2*3-(f*2)Z7-?5 0-時 LZF憲 2-卄(3 (2)-3)2-522*(4.4-2
18、-4)2*(4-4-3-1)(2-4)"3(2-4)"(5-8)艾件(£)騙輯格式功査看邊|2a-19.906.0 06.0012,708.3 9u_i*e-1.90-F2.0&-1.006-?54.002-Ufi-8-00-0.13V|5.3容錯測試:在input文件中輸入表達式如下圖7:C Output.tit -記事本 匸叵區(qū))丈件疋編輯 格式辺 直看 幫助迅)2/0酩0(2-4>*3-12.彌2V.52+3)(-5(2)-3)(C(CZ)-3)(5.6-2>35(3.2-2.1)3*8.24-11* + +11tt12 2+ +文件世)
19、騙輯 格式0)査看 幫肋龜)Error inError inError inError InError inError inError inErrffr inError inError inError inError inError inError inError inError InError ininfix infiw infTH infiK infix irifiw infix infiK InFiK infix iriFix infiK inFix infix infix infix infixnotation. notation. notation. notation. notati
20、on. notation. notzation _ notation. notation. notation. notation. notation. notation. notation. notation. notation. notation.6設(shè)計心得通過此次的課程設(shè)計,鞏固和加深了我對棧、隊列、字符串等理論知識的理解;掌握現(xiàn)實復(fù)雜問題的分析建模和解決方法(;提高利用計 算機分析解決綜合性實際問題的基本能力。在細(xì)節(jié)問題的分析上,較以往有了很大的提高。在尋求最優(yōu)解的問 題上,也能夠找到多種解決方案來使自己的程序收放自如。如,在處理 實數(shù)的問題上,我采用的是每取得一個字符,就立刻對此字符進
21、行處理 的方法。其實,我們可以用一個字符數(shù)組,來存儲連接著的一系列數(shù)字 字符,然后再通過 atof 函數(shù),直接得到字符數(shù)組中所存儲的數(shù)字。 再如, 對負(fù)數(shù)問題的處理上,我最初的想法是通過一個標(biāo)志 mark 來記錄前面 的字符是否是負(fù)號(或減號) ,再在后面取到除符號外的數(shù)字時,選擇 是否添加負(fù)號。另外,與其他人不同的是, 在我的課程設(shè)計中, Compare ()函數(shù)與其他有著很大的區(qū)別。通常情況下,同學(xué)們參照課本,都會 采用占用 7*7=49 個空間的數(shù)組來分別存儲對應(yīng)兩個字符的優(yōu)先級符號, 并對兩個字符進行預(yù)算之后得到數(shù)組中的位置。 雖然 7*7 的數(shù)組所占的 空間并不是非常大,但在我看來這
22、也是一種浪費,并且空間的浪費并沒 有換回時間一定的節(jié)省。因此,我采用了一種常規(guī)的思路。將各種運算 符按照數(shù)學(xué)邏輯上的優(yōu)先順序進行排序, 并得到兩個字符之間的優(yōu)先級 關(guān)系。這樣一來,我們將不再需要那 7*7 的數(shù)組,且時間復(fù)雜度并不大 幅增漲。在這個課程設(shè)計中,運用到的數(shù)據(jù)結(jié)構(gòu)的知識主要是棧的知識。棧 在各種軟件系統(tǒng)中,應(yīng)用非常廣泛。棧的的存儲特性 (LIFO 先進后出 ), 使得在用棧來編程時,思路清晰明了。在使用遞歸算法時,棧也是一種 很好的選擇。此外,這次的課程設(shè)計進一步加強了我們運用 C 語言進行編程,調(diào) 試,處理問題的能力,加深了我們對算法及數(shù)據(jù)結(jié)構(gòu)的認(rèn)識。同時我也 意識到,開發(fā)程序的
23、早期計劃要做的充分,以免出現(xiàn)程序完成后發(fā)現(xiàn)不 足而帶來的修改麻煩。雖然這只是一個小小的軟件,但對我們之后的影 響確實很大的。7 附:源程序清單#include <stdio.h>#include <stdlib.h>#include <math.h>int PrintError = 0;/*全局變量, 0代表正常, 1代表表達式出錯 */*/*char類型鏈表式堆棧,用來存放運算符號,以及用在中綴表達式轉(zhuǎn)換等時候 typedef struct Node *PtrToNode;typedef PtrToNode Stack;int IsEmpty(Stack
24、S);void MakeEmpty(Stack S);void Push(char X,Stack S);char Top(Stack S);void Pop(Stack S);typedef struct Nodechar Element;PtrToNode Next;/*float 類型鏈表式堆棧,用來存放操作數(shù) */ typedef struct FNode *Ptr_Fn;typedef Ptr_Fn FStack;int FisEmpty(FStack S);void FPush(float X,FStack S);float FTop(FStack S);void FPop(FSt
25、ack S);typedef struct FNodefloat Element;Ptr_Fn Next;void ConvertToPost(FILE *In, Stack Whereat,FILE *Temp); void Reverse(Stack Rev);void Calculate(FILE *Change, Stack Whereat,FILE *Temp);/* 主函數(shù) */int main()/* 初始化變量 */FILE *InputFile, *OutputFile,*Temp;Stack Whereat; char sample;/*打開文件 */*給 Whereat分
26、配空間*/*錯誤處理 */InputFile = fopen("Input.txt","r");OutputFile = fopen("Output.txt","w");Whereat = malloc(sizeof(struct Node); Whereat->Next = NULL;if (!Input !OutputFile) printf("intput or output file(s) do not exist.n"); return(1);sample = getc(Inpu
27、tFile);/*生成Temp文件*/ /* put back samp le字符 */*中綴變后綴 */*錯誤處理 */while ( sample != EOF)Temp = fopen("Temp.txt","w+"); ungetc(sample,InputFile);ConvertToPost(Input);if (PrintError)fprintf(OutputFile,"Error in infix notation."); fscanf(InputFile,"n",&sample);Pri
28、ntError = 0;else if (IsEmpty(Whereat) = 1)else if (IsEmpty(Whereat) != 1)Reverse(Whereat);if (Top(Whereat) = 'B')/*跳過在input文件中的空格*/PrintError = 1;數(shù)而不是運算符號 */fclose(Temp);Temp = fopen("Temp.txt","r+");Calculate(OutputFile, Whereat,Temp);fclose(Temp);MakeEmpty(Whereat); put
29、c('n',OutputFile);sample = getc(InputFile);/*錯誤處理, */*A表示操作數(shù)B表示運算符*/* 后綴表達式第一個元素應(yīng)是操作/*計算結(jié)果 */*/*清空Whereat用來處理下一行*/在輸出文件中換行 */* While 循環(huán)結(jié)束 */free(Whereat);fclose(InputFile);fclose(OutputFile);/* 刪除 Temp.txt*/remove("Temp.txt");return 1;/* 檢查堆棧是否為空 */int IsEmpty(Stack S)return(S->
30、Next=NULL);/*檢查float堆棧是否為空*/int FIsEmpty(FStack S)return(S->Next=NULL);/* 彈出棧頂元素 */void Pop(Stack S)PtrToNode FirstCell;if (IsEmpty(S)perror("Empty Stack");elseFirstCell = S->Next;S->Next = S->Next->Next;/*free(FirstCell);彈出float棧頂元素*/void FPop(FStack S) Ptr_Fn FirstCell;if
31、(FIsEmpty(S)perror("Empty Stack"); elseFirstCell = S->Next;S->Next = S->Next->Next; free(FirstCell);/* 將堆棧置空 */void MakeEmpty(Stack S) if (S = NULL) perror("Must use Createstack first");elsewhile (!IsEmpty(S) Pop(S);/* 將float 堆棧置空 */void FMakeEmpty(FStack S)if (S = NU
32、LL)perror("Must use Createstack first");elsewhile (!IsEmpty(S) Pop(S);/* 元素進棧 */void Push(char X, Stack S)PtrToNode TmpCell;TmpCell = (PtrToNode)malloc(sizeof(struct Node); if (TmpCell = NULL)perror("Out of Space!");elseTmpCell->Element = X;TmpCell->Next = S->Next;S->
33、Next = TmpCell;/*float 元素進棧 */void FPush(float X, FStack S)Ptr_Fn TmpCell;TmpCell = (Ptr_Fn)malloc(sizeof(struct FNode);if (TmpCell = NULL) perror("Out of Space!");elseTmpCell->Element = X; TmpCell->Next = S->Next; S->Next = TmpCell;/* char Top(Stack S)返回棧頂元素 */if (!IsEmpty(S)r
34、eturn S->Next->Element; perror("Empty Stack"); exit(1);return 0;/* 返回 float棧頂元素 */float FTop(FStack S)if (!FIsEmpty(S)return S->Next->Element;perror("Empty Stack");exit(1);return 0;/* 將堆棧元素倒置 */void Reverse(Stack Rev)Stack Tempstack;Tempstack = malloc(sizeof(struct No
35、de);Tempstack->Next = NULL;while (!IsEmpty(Rev)Push(Top(Rev),Tempstack); Pop(Rev);Rev->Next = Tempstack->Next;/* 將元素壓棧到一個臨時堆棧 */* 指向新的堆棧 */*Whereat 說明:Whereat記錄了操作數(shù)和運算符號的位置,用 A和B區(qū)分。A = operand, B = operator. (例如1+2轉(zhuǎn)換成12+,在whereat中的形式應(yīng)該是 AAB)Op Holder說明:Cha類型的堆棧Op holder用來保存運算符號。*/* 將中綴表帶式轉(zhuǎn)換
36、為后綴表達式 */void ConvertToPost(FILE *In, Stack Whereat, FILE *Temp)Stack OpHolder;char holder;char lastseen;/*操作數(shù)的計數(shù)器 */*初始化*/int digitcounter = 0;OpHolder = malloc(sizeof(struct Node);OpHolder->Next = NULL;holder=getc(In);/* 用來防止輸入格式錯誤, 例如兩個小數(shù)點 */lastseen = ''putc(' ',Temp);while (h
37、older !='n') && (holder != EOF) if (holder = ' ') digitcounter = 0;/*如果holder不是操作數(shù)或運算符else if ( IsOperator(holder) = -1)號*/PrintError = 1;else if (IsOperator(holder)=0)if (lastseen = holder) && (lastseen = '.')/*錯誤處理 */PrintError = 1;else lastseen = holder;/*進
38、棧*/*計數(shù)器加一 */if (digitcounter = 0) Push('A',Whereat); digitcounter+; putc(' ',Temp); putc(holder,Temp);else digitcounter = 0;if (lastseen = holder) && (lastseen != '(') && (lastseen != ')')/*"(" 情況特殊對待 */PrintError = 1;else lastseen = holder;/
39、* 當(dāng) OpH older 為空 */if(IsEmpty(OpHolder)=1) Push(holder,OpHolder);else if(OperatorValue(Top(OpHolder) = 6) /*OpHolder 是"("的情況 */ if(OperatorValue(holder)=5) Pop(OpHolder);else Push(holder,OpHolder);else if(OperatorValue(holder) = 6) Push(holder,OpHolder);/* OpHolder是")"的情況 */ (Ope
40、ratorValue(Top(OpHolder) != else if(OperatorValue(holder) = 5)while(IsEmpty(OpHolder) != 1) && 6)putc(' ',Temp);Push('B',Whereat);putc(Top(OpHolder),Temp);Pop(OpHolder);/*錯誤處理,括號不匹配 */if (IsEmpty(OpHolder) = 1) PrintError = 1;elsePop(OpHolder);else if(OperatorValue(holder) =
41、OperatorValue(Top(OpHolder)/* 冪運算情況 */&& (OperatorValue(holder) = 3) Push(holder,OpHolder);else if(OperatorValue(holder) < OperatorValue(Top(OpHolder)&& OperatorValue(Top(OpHolder) = 3)/*冪運算情況 */putc(' ',Temp);Push('B',Whereat); putc(Top(OpHolder),Temp);Pop(OpHolde
42、r); while(IsEmpty(OpHolder) != 1) && (OperatorValue(Top(OpHolder)= 3)Push('B',Whereat);putc(' ',Temp);putc(Top(OpHolder),Temp);Pop(OpHolder);Push(holder,OpHolder);/*如果當(dāng)前運算符號的優(yōu)先級小于或者等于堆棧中的運算符號的優(yōu)先級,則將其放入tem p中,并且將堆棧中的運算符號出棧,放入tem p中,直到堆棧為空或者優(yōu)先級小 于堆棧頂元素的優(yōu)先級*/else if(OperatorValu
43、e(Top(OpHolder) >= OperatorValue(holder) while(IsEmpty(OpHolder) != 1)>=&&(OperatorValue(Top(OpHolder)OperatorValue(holder)&& (OperatorValue(Top(OpHolder)!=6) putc(' ',Temp); putc(Top(OpHolder),Temp); Push('B',Whereat); Pop(OpHolder); Push(holder,OpHolder);else
44、if(OperatorValue(Top(OpHolder) < OperatorValue(holder)/*如果當(dāng)前運算符號的優(yōu)先級大于堆棧中的運算符號的優(yōu)先級,則將其壓入堆棧中*/Push(holder,OpHolder); holder=getc(In);/* While循環(huán)結(jié)束*/ while(IsEmpty(OpHolder)!=1)/*最后如果堆棧中還有運算符號,則一并放到temp中*/Push('B',Whereat);putc(' ',Temp); putc(Top(OpHolder),Temp);Pop(OpHolder);MakeEm
45、pty(OpHolder); free(OpHolder);/* 判斷類型, 1為運算符號, 0為操作數(shù), -1為錯誤 */int IsOperator(char ToCompare)if (ToCompare = '(' | ToCompare = ')'| ToCompare = '+' | ToCompare = '-'II ToCo mpare = '*'| ToCo mpare = '/' | ToCo mpare ='人'| ToCo mpare = '%'
46、;)return 1;else if (ToCompare = '1' II ToCompare = '2'II ToCompare = '3'II ToCompare = '4' II ToCompare = '5'II ToCompare = '6'II ToCompare = '7'II ToCompare = '8' II ToCompare = '9'II ToCompare = '0'II ToCompare = '
47、.')return 0;elsereturn -1;/* 返回運算符號的優(yōu)先級 */int OperatorValue(char ValueToGive)if (ValueToGive = '(') return 6;if (ValueToGive = ')') return 5;if (ValueToGive ='的 return 3;if (ValueToGive = '%') return 2;if (ValueToGive = '*') return 2;if (ValueToGive = '/
48、39;) return 2;if (ValueToGive = '+') return 1;if (ValueToGive = '-') return 1;return 0;/* 計算后綴表達式 */void Calculate(FILE *Change, Stack Whereat, FILE *Temp) FStack Operands;float looker;char Op;char spacefinder;float answer = 0;float NumA;float NumB;Operands = (Ptr_Fn)malloc(sizeof(st
49、ruct FNode); Operands->Next= NULL;while (IsEmpty(Whereat) != 1) && PrintError != 1)/*循環(huán)直到Whereat空,或者遇到錯誤*/*如果是A,則是操作數(shù)*/if (Top(Whereat) = 'A') fscanf(Temp," ",&spacefinder); fscanf(Temp,"%f",&looker); FPush(looker,Operands); Pop(Whereat);/*/*如果是B,則是運算符*
50、/判斷是什么運算符 */*冪運算*/else if (Top(Whereat) = 'B') fscanf(Temp," ",&spacefinder); Op = getc(Temp); switch(Op)case('A'):NumB = FTop(Operands);FPop(Operands);/*錯誤處理 */if (FIsEmpty(Operands)PrintError = 1;elseNumA = FTop(Operands); FPop(Operands);if (NumA = 0 && NumB < 0)
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 氣密條施工方案
- 尿素脫硝施工方案
- 陜西財稅知識培訓(xùn)課件
- 第2單元第2節(jié)《人機的互動》教學(xué)設(shè)計 2023-2024學(xué)年粵教清華版初中信息技術(shù)七年級下冊
- 光伏材料合同范例
- 合同范本運用方法
- 年度創(chuàng)新思維與實踐分享計劃
- 產(chǎn)品定價和利潤計劃
- 精細(xì)化管理在急診科的應(yīng)用計劃
- 安徽省合肥市長豐縣七年級生物上冊 1.1.1 生物的特征教學(xué)實錄2 (新版)新人教版
- 2025年個人所得稅贍養(yǎng)老人費用分?jǐn)倕f(xié)議模板
- 2025人教版(2024)小學(xué)美術(shù)一年級下冊教學(xué)計劃、教學(xué)設(shè)計及教學(xué)反思(附目錄)
- 醫(yī)療器械使用安全和風(fēng)險管理培訓(xùn)課件
- 2025年江西工業(yè)貿(mào)易職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫帶答案
- 雷鋒的故事春鋒十里暖童心小小雷鋒在學(xué)習(xí)課件
- 語文-云南省師范大學(xué)附屬中學(xué)2025屆高三下學(xué)期開學(xué)考試試題和答案
- 英語學(xué)科核心素養(yǎng)下小學(xué)英語繪本閱讀教學(xué)現(xiàn)狀及對策研究
- 外周靜脈解剖知識
- 2025年飼料及寵物食品項目建議書
- 《走近世界民間美術(shù)》 課件 2024-2025學(xué)年人美版(2024)初中美術(shù)七年級下冊
- 河南2025年02月鄭州市公安機關(guān)公開招考1200名警務(wù)輔助人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
評論
0/150
提交評論