ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:18.84KB ,
资源ID:2841214      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2841214.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计表达式求值.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计表达式求值.docx

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