中缀表达式求值实验报告_第1页
中缀表达式求值实验报告_第2页
中缀表达式求值实验报告_第3页
中缀表达式求值实验报告_第4页
中缀表达式求值实验报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业中缀表达式求值实验报告一、需求分析(要实现的功能描述)1问题描述:在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。2实现功能:算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为“+、-、*、/”。算法运行:将输入的中缀表达式改为后缀表达式,并进行运算。算法输出:输出后缀表达

2、式和表达式运算结果。3测试数据:(1)、1+3*4-(5/5); 一位数运算(2)、45-5*(1+2)/5; 多位数运算二、概要设计整个程序包含功能模块及模块间的调用关系(1)、struct node 创建结构体,被主函数调用(2)、struct node *Initialization() 创建栈链,被主函数调用(3)、struct node *assort(struct node *s) 将中缀表达式转换为后缀表达式并存在s2中被主函数调用(4)、struct node *calcolate(struct node *s) 求出表达式的值,被主函数调用(5)、void main() 主函

3、数,调用所有函数三、详细设计抽象数据类型中定义的各种操作算法实现(用N-S图描述)开始输入中缀表达式将中缀表达式转换成后缀表达式并存入s2中输出后缀表达式计算结果输出结果结束四、调试分析1程序在调式过程中出现的问题及解决方法 一开始选用直接运算方式运用两个栈来存放数字和操作符,后来写着确实不行然后直接转用转为后缀表达式再进行计算。 在写将多位数(比如123*12)存放字符串中时,一开始我想着直接转换成数字存入数组中,但一直不成功,只能将第一个多位数转换成功;后来在和同学之间交流并且百度搜索后改为直接存入字符串中,再存入字符串过程中,我发现几个数字之间可能没法区分是前一个数字的还是后一个数字的,

4、于是我在扫描字符串过程中在扫描到操作字符时将存入数字的那个字符串s2空出一位,用以区分前后两个数字,如12+45*,如果直接存入字符串中会是 s2:1245*+;但加空格后为s2:12(空格)45*+;这样后面运算时就好区分两多位数字。 2心得体会 在写程序之前要选择适合自己的算法即自己熟悉的能编出的算法,这样后续的编程会简便多了。 对于一个要实现的功能,会有很多不同的算法,当你一个算法用不了时,可以换一个算法编程,目的是死的,人是活的,算法是活的,程序也是活的!五、用户手册该软件的操作方法简介输入一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整

5、数,操作符为“+、-、*、/”,按回车结束输入。程序运行输出输出后缀表达式和表达式运算结果。六、测试结果根据已提供的测试数据得到什么样的结果(可以截屏)(1)、1+3*4-(5/5);(2)、45-5*(1+2)/5;七、程序清单#include#include#include#include#define MAX 60#define RIGHT 1#define WRONG 0#define DEMAX 15#define NULL 0char s1MAX;char s2MAX;int j=0;struct node /定义结构体。 char data; int num; struct no

6、de *next;struct node *Initialization()/初始化栈链,链栈不带头结点 struct node *top; top=(struct node *)malloc(sizeof(struct node); top-data=; top-num=0; top-next=NULL; return top;struct node *assort(struct node *s)/输入字符串 struct node *p,*top; int i; top=s; int m; char a; m=strlen(s1); for(i=0; i=m; i+) a=s1i; if(

7、0=s1i&s1idata=a; p-next=top; top=p; break; case *: case /: s2j= ; j+; if(top-data=*)|(top-data=/) s2j=top-data; j+; /比其高,现将栈顶运算符出栈,再进栈。 top-data=a; break; else p=(struct node *)malloc(sizeof(struct node);/否,直接进栈 p-data=a; p-next=top; top=p; break; case +: case -: s2j= ; j+; if(top-data=+|top-data=-|

8、top-data=*|top-data=/) s2j=top-data; j+; top-data=a; break; else p=(struct node *)malloc(sizeof(struct node); p-data=a; p-next=top; top=p; break; case ): s2j= ; j+; if(top-data=;) printf(input error); break; while(top-data!=() s2j=top-data; j+; p=top; top=top-next; free(p); p=top; top=top-next; free

9、(p); break; while(top-data!=;) s2j=top-data; j+; p=top; top=top-next; free(p); s2j=; printf(后缀表达式为:); for(i=0; ij; i+) if(s2i!= ) printf(%c ,s2i); printf(n ); return top;struct node *calcolate(struct node *s)/计算表达式的值 struct node *top,*p; char *q; int x,y,a; int i,n; top=s;/指向栈顶的指针 for(i=0; i=0&s2i=0

10、&s2nnum=a; p-next=top; top=p; i=n-1; else if(s2i=;) /遇;号结束标志,输出栈中的最后计算结果 printf(计算结果为:%dn,top-num); else if(s2i= ) else y=top-num; p=top; top=top-next; free(p); x=top-num; p=top; top=top-next; free(p); switch(s2i) case +: a=x+y; p=(struct node *)malloc(sizeof(struct node); p-num=a; p-next=top; top=p; break; case -: a=x-y; p=(struct node *)malloc(sizeof(struct node ); p-num=a; p-next=top; top=p; break; case *: a=x*y; p=(struct node *)malloc(sizeof(struct node ); p-num=a; p-next=top; top=p; break; case /: a=(float)x/y; p=(struct node *)malloc(sizeof(struct node ); p-num=a; p-ne

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论