1、中缀表达式求值实验报告中缀表达式求值实验报告一、 需求分析(要实现的功能描述)1.问题描述:在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的 运算符具 有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。 因而在程序设计时,借助栈实现。2.实现功能:算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输 入)。为简化,规定操作数只能为正整数,操作符为 “、+-、*、/ ” o算法运行:将输入的中缀表达式改为后缀表达式,并进行运算。算法输出:输出后缀表达式和表达式运算结果。3.测试数据:(1)、1+3*4-(5/5);位数运算(2)、4
2、5-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()主函数,调用所有函数三、 详细设计抽象数据类型中定义的各种操作算法实现(用 N-S图描述)开始输入
3、中缀表达式将中缀表达式转换成后缀表达式并存入s2中输出后缀表达式计算结果输出结果结束四、 调试分析1.程序在调式过程中出现的问题及解决方法一开始选用直接运算方式运用两个栈来存放数字和操作符,后来写着确实不行然后 直接转用转为后缀表达式再进行计算。在写将多位数(比如123*12)存放字符串中时,一开始我想着直接转换成数字存 入数组中,但一直不成功,只能将第一个多位数转换成功;后来在和同学之间交流并且 XX搜索后改为直接存入字符串中,再存入字符串过程中,我发现几个数字之间可能没 法区分是前一个数字的还是后一个数字的,于是我在扫描字符串过程中在扫描到操作字符时将存入数字的那个字符串 s2空出一位,用
4、以区分前后两个数字,如12+45*,如果直接存入字符串中会是s2: 1245*+;但加空格后为s2: 12 (空格)45*+ ;这样后面运算时就好区分两多位数字。2.心得体会在写程序之前要选择适合自己的算法即自己熟悉的能编出的算法,这样后续的编程 会简便多了。对于一个要实现的功能,会有很多不同的算法,当你一个算法用不了时,可以换一 个算法编程,目的是死的,人是活的,算法是活的,程序也是活的!五、 用户手册该软件的操作方法简介输入一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为 简化,规定操作数只能为正整数,操作符为 “、+-、*、/ ”,按回车结束输入。程序运行输出输出后
5、缀表达式和表达式运算结果。六、 测试结果根据已提供的测试数据得到什么样的结果(可以截屏)(1) 、1+3*4-(5/5);(2) 、 45-5*(1+2) /5;七、 程序清单#include#include#include#includeftdefine MAX 60ftdefine RIGHT 1define WRONG 0define DEMAX 15define NULL 0char siMAX;char s2MAX;int j=0;struct node /定义结构体。char data;int num;struct node *next;struct node initializa
6、tion()/初始化栈链,链栈不带头结点struct node *top;top-data=,;assort (struct node *s)/ 输入字符串struct node *p,*top;int i;top=s;int m;char a; nFstrlen(sl);for (i=0; i=m; i+)a=sli;辻(=sli&slidata=a; p-next=top;top二p;break;case *:case /:s2j八;j+;if (top-data=,*) | | (top-data=,/)fs2j二top-data;j+; /比其高,现将栈顶运算符出栈,再进栈top-da
7、ta=a;break;elsep= (struct node *)malloc(sizeof (struct node) ;/ 否,直接进栈 p-data=a; p-next=top;top二p;break;case +,:case :fs2j八;j+;if (top-data,| | top-data,-| |top-data,*,H top_data二二,) s2j=top-data; j+;top-data=a;break;elsefp= (struct node *)malloc(sizeof(struct node); p-data=a;p-next=top;top二p;break;
8、case ):fs2j八;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 (p);break;while(top-data!=,;)s2j二top-data;j+;p二top;top=top-next; free (p);Js2j“;printfC 后缀表达式为:); for(i=0; ij;printf (z/%c , s2i);printf Cn );retur
9、n 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=O&s2 n num=a; p-next=top;top二p;i=n-l;else if(s2i=;) 遇;号结束标志,输出栈中的最后计算结果printfC 计算结果为:dn, top-num);elseelsey=top-num;p二top;top=top-next;free(p);x二top-num;p二top;top=to
10、p-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 :沪 x-y ;p= (struct node *)malloc(sizeof(struct node ); p-num=a; p-next=top;top二p;break;case *:fa=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-next=top;top二p;break;return 0;void main()struct node *top,*head; top=InitializationO;printfC请输入表达式(运算符号可以为:+、-、*、/、 (、) : n);gets(sl);head二assort(top); calcolate(head);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1