1、数据结构课程设计表达式求值1. ch0201:表达式求值,在VC+6.0环境下测试通过 文件main.c:案例源程序; 文件input.txt:案例测试输入数据文件; 文件output.txt:案例测试输出结果文件; 2源代码#include #include #include int PrintError = 0;/*全局变量,0代表正常,1代表表达式出错*/*char类型链表式堆栈,用来存放运算符号,以及用在中缀表达式转换等时候*/typedef struct Node *PtrToNode;typedef PtrToNode Stack;int IsEmpty(Stack S);void
2、 MakeEmpty(Stack S);void Push(char X,Stack S);char Top(Stack S);void Pop(Stack S);typedef struct Node char Element; PtrToNode Next;/*float类型链表式堆栈,用来存放操作数*/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(FStack S);
3、typedef struct FNode float Element; Ptr_Fn Next;void ConvertToPost(FILE *In, Stack Whereat,FILE *Temp);void Reverse(Stack Rev);void Calculate(FILE *Change, Stack Whereat,FILE *Temp);/*主函数*/int main() FILE *InputFile, *OutputFile,*Temp; /*初始化变量*/ Stack Whereat; char sample; InputFile = fopen(Input.tx
4、t,r); /*打开文件*/ OutputFile = fopen(Output.txt,w); Whereat = malloc(sizeof(struct Node); /*给 Whereat分配空间*/ Whereat-Next = NULL; if (!InputFile | !OutputFile) /*错误处理*/ printf(intput or output file(s) do not exist.n); return(1); sample = getc(InputFile); while ( sample != EOF) Temp = fopen(Temp.txt,w+);
5、 /*生成Temp文件*/ ungetc(sample,InputFile); /* put back sample字符*/ ConvertToPost(InputFile,Whereat,Temp); /*中缀变后缀*/ if (PrintError) /*错误处理*/ fprintf(OutputFile,Error in infix notation.); fscanf(InputFile,n,&sample); PrintError = 0; else if (IsEmpty(Whereat) = 1) /*跳过在input文件中的空格*/ else if (IsEmpty(Where
6、at) != 1) Reverse(Whereat); if (Top(Whereat) = B) /*错误处理,*/ /*A表示操作数B表示运算符*/ PrintError = 1; /*后缀表达式第一个元素应是操作数而不是运算符号*/ fclose(Temp); Temp = fopen(Temp.txt,r+); Calculate(OutputFile, Whereat,Temp); /*计算结果*/ fclose(Temp); MakeEmpty(Whereat); /* 清空Whereat用来处理下一行*/ putc(n,OutputFile); /* 在输出文件中换行*/ sam
7、ple = getc(InputFile); /* While循环结束*/ free(Whereat); fclose(InputFile); fclose(OutputFile); remove(Temp.txt); /* 删除Temp.txt*/ return 1;/*检查堆栈是否为空*/int IsEmpty(Stack S) return(S-Next=NULL); /*检查float堆栈是否为空*/int FIsEmpty(FStack S) return(S-Next=NULL); /*弹出栈顶元素*/void Pop(Stack S) PtrToNode FirstCell; i
8、f (IsEmpty(S) perror(Empty Stack); else FirstCell = S-Next; S-Next = S-Next-Next; free(FirstCell); /*弹出float栈顶元素*/void FPop(FStack S) Ptr_Fn FirstCell; if (FIsEmpty(S) perror(Empty Stack); else FirstCell = S-Next; S-Next = S-Next-Next; free(FirstCell); /*将堆栈置空*/void MakeEmpty(Stack S) if (S = NULL)
9、perror(Must use Createstack first); else while (!IsEmpty(S) Pop(S);/*将float堆栈置空*/void FMakeEmpty(FStack S) if (S = NULL) perror(Must use Createstack first); else while (!IsEmpty(S) Pop(S);/*元素进栈*/void Push(char X, Stack S) PtrToNode TmpCell; TmpCell = (PtrToNode)malloc(sizeof(struct Node); if (TmpCe
10、ll = NULL) perror(Out of Space!); else TmpCell-Element = X; TmpCell-Next = S-Next; S-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!); else TmpCell-Element = X; TmpCell-Next = S-Next; S
11、-Next = TmpCell; /*返回栈顶元素*/char Top(Stack S) if (!IsEmpty(S) return 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
12、= malloc(sizeof(struct Node); Tempstack-Next = NULL; while (!IsEmpty(Rev) Push(Top(Rev),Tempstack); /*将元素压栈到一个临时堆栈*/ Pop(Rev); Rev-Next = Tempstack-Next; /*指向新的堆栈*/*Whereat 说明:Whereat 记录了操作数和运算符号的位置,用A和B区分。A = operand, B = operator. (例如 1+2转换成12+,在whereat中的形式应该是 AAB)OpHolder说明:Char类型的堆栈Opholder用来保存运
13、算符号。*/*将中缀表带式转换为后缀表达式*/void ConvertToPost(FILE *In, Stack Whereat, FILE *Temp) Stack OpHolder; char holder; char lastseen; int digitcounter = 0; /*操作数的计数器*/ OpHolder = malloc(sizeof(struct Node); /*初始化*/ OpHolder-Next = NULL; holder=getc(In); lastseen = ; /*用来防止输入格式错误,例如两个小数点*/ putc( ,Temp); while (holder !=n) & (holder != EOF) if (holder = ) digitcounter = 0; else if ( IsOperator(holder) = -1) /*如果holder不是操作数或运算符号*/ PrintError = 1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1