logo资料库

数据结构课程设计实验报告(后缀表达式的计算)..doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
2009~ 2010 学年度第二学期 赣南师范学院数学与计算机科学学院 数据结构课程设计报告册 课程设计名称:后缀表达式的计算 专 班 学 姓 业: 信息与计算科学 级: 号: 名: 07*****本 0707***** ****** 指 导 老 师: 王**老师
课程设计任务一览表 序号 课程设计任务名称 设计专题任务描述(可附页) 1 问题的描述和分析 设计一个程序,实现中缀表达式与后缀表达之间的转换 并对后缀表达式进行计算并输出结果 2 3 4 5 6 算法的设计 见设计报告 数据结构的设计 见设计报告 具体程序的实现 见设计报告 界面设计 见设计报告 调试情况 在文档 a 中输入 5+6*6-9-8,执行程序,选择 a.txt。 选择功能 1 查看到文档 a 中的中缀表达式 5+6*6-9-8。 选择功能 2 查看到对应的后缀表达式为 566*+9-8-。 选择功能 3 计算出后缀表达式的计算结果为 24。 选择功能 4 成功将程序运行并保存结果。 选择功能 5 成功查看到上一次的运行结果也为 24 选择功能 6 成功关闭程序 算法的分析和评价 7 及本次上机实验的 心得 这次实验很成功,在初次的设计目的上增加了中缀表达式 与后缀表达式的转换功能,这样少了繁杂的后缀表达式录 入过程,操作相对变得简易,减轻了用户的工作量。以后 的实验及作品我们也要注重这方面改正,这样不仅能提高 自己的能力,也能方便使用者。 指导用书:_ __
课程设计报告 1 名 称 后缀表达式的计算 计算机 附属 设备 U 盘 VC6.0 起止时间 2010 年 4 月 1 日 — 2010 年 5 月 1 日 设计项目 编 号 主要 仪器 设备 主要 使用 软件 课程设计任务书 同组人 *** 1. 问题的描述和分析 2. 算法的设计 3. 数据结构的设计 4. 具体程序的实现 5. 界面设计 6. 调试情况 7. 算法的分析和评价及本次上机实验的心得
课 程 设 计 报 告 一、算法的设计: 后缀表达式运算的思想为依次读入表达式中的每一个字符,若当前字符是运算对象,入对象栈,是运算符 时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低则从对象栈出栈 两个运算量,从算符栈出栈一个运算符进行,并将运算结果入对象栈,继续处理当前字符,直到遇到结束 符。 根据运算规则,每个运算符栈内、栈外的级别如下: 算符 ^ *、/、% +、- ( ) 栈内级别 栈外级别 3 2 1 0 -1 4 2 1 4 -1 后缀表达式的结果计算主要涉及的数据结构为栈结构,包括下面一些操作,如进栈、出栈、判断栈是否为 空 、及栈是否为满、读栈顶元素等操作,同时也涉及了文件的读取及输出等操作。 设计如下几个函数模块: pseqstack creatnullstack();/*创建空栈*/ char *fileread(char *infix,char *filename); /*读取文件*/ void push(pseqstack pstack,char c); /*算符入栈*/ void pushu(pseqstack pstack,int num); /*操作数入栈*/ void pop(pseqstack pstack); /*出栈*/ char top(pseqstack pstack); /*读取栈顶算符*/ int topshu(pseqstack pstack); /*读取栈顶操作数*/ int isempty(pseqstack pstack); /*判断栈是否为空*/ char *infixtosuffix(char *infix,char *suffix); /*中缀表达式转换成后缀表达式*/ int caculatesuffix(char *suffix); /*后辍表达式结果计算*/ void filewrite(char *infix,char *suffix); /*文件输出*/ void filedisplay(char *infix,char *suffix); /*打开文件*/ void putscreen();/*屏显*/ 二、数据结构的设计 两个栈包括在一个数据结构里面,通过对读取的字符类型进行判断来决定它该入哪个栈。 struct seqstack { int m; int t; char s[100]; /*算符栈*/ int shu[100]; /*对象栈*/ };
三、具体程序的实现 #include #include #include #include #define FALSE 0 #define TRUE 1 #include"head.h" pseqstack creatnullstack()/*创建空栈*/ { pseqstack pstack=(pseqstack)malloc(sizeof(struct seqstack)); if(pstack) { pstack->m=0; pstack->t=-1; } else printf("Out of Space!\n"); return pstack; } char *fileread(char *infix,char *filename) /*从文件中读入表达式*/ { FILE *fp; int i=0; if((fp=fopen(filename,"rb"))==NULL) { printf("%s 文件不存在!\n 请先建立文件!\n",filename); exit(0); } while(!feof(fp)) { infix[i++]=fgetc(fp); } infix[i-1]='\0'; fclose(fp); return infix; //printf("中缀表达式为:\n%s",infix); }
void filewrite(char *infix,char *suffix) /*打开文件*/ { FILE *fp; char temp[100],buff[50]; if((fp=fopen("result.txt","wb"))==NULL) { printf("写文件出错!\n"); exit(0); } strcpy(temp,infix); strcat(temp,suffix); itoa(caculatesuffix(suffix),buff,10);//整型转字符型 strcat(temp,buff); fwrite(temp,strlen(temp),1,fp);//写文件 fclose(fp); } void filedisplay(char *infix,char *suffix) /*打开文件*/ { FILE *fp; char tmp[50]; int i=0; if((fp=fopen("result.txt","rb"))==NULL) { printf("文件不存在,请先保存数据!\n"); exit(0); } printf("中缀表达式为:\n"); fread(tmp,strlen(infix),1,fp); tmp[strlen(infix)]='\0'; printf("%s\n",tmp); printf("后缀表达式为:\n"); fread(tmp,strlen(suffix),1,fp); tmp[strlen(suffix)]='\0'; printf("%s\n",tmp); printf("计算结果为:\n"); while(!feof(fp)) tmp[i++]=fgetc(fp); tmp[i-1]='\0'; printf("%s\n",tmp); }
void push(pseqstack pstack,char c) /*算符入栈*/ { pstack->t=pstack->t+1; pstack->s[pstack->t]=c; pstack->m++; } void pushu(pseqstack pstack,int num) /*操作数入栈*/ { pstack->t=pstack->t+1; pstack->shu[pstack->t]=num; pstack->m++; } void pop(pseqstack pstack) /*出栈*/ { pstack->t=pstack->t-1; pstack->m--; } char top(pseqstack pstack) /*读栈顶算符*/ { return(pstack->s[pstack->t]); } int topshu(pseqstack pstack) /*读栈顶操作数*/ { return(pstack->shu[pstack->t]); } int isempty(pseqstack pstack) /*栈断栈是否为空*/ { if(pstack->t==-1) else return 1; return 0; } char *infixtosuffix(char *infix,char *suffix) /*中缀表达式转换成后缀表达式*/
{ int state=0; char c,c2; int i,j=0; pseqstack ps=creatnullstack(); if(infix[0]=='\0') exit(0); for(i=0;infix[i]!='\0';i++) { c=infix[i]; switch(c) { case' ': case'\t': case'\n': if(state==1) suffix[j++]=' '; state=0; break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': state=1; suffix[j++]=c; break; case'(': if(state==1) suffix[j++]=' '; state=0; push(ps,c); break; case')': if(state==1) suffix[j++]=' '; state=0; while(!isempty(ps)) {
分享到:
收藏