中缀表达式求值
- 格式:doc
- 大小:138.00 KB
- 文档页数:12
江西理工大学软件学院计算机类课程实验报告课程名称:数据结构班级:11软件会计4班姓名:黄健学号:11222122江西理工大学软件学院一、目录(中缀表达式求值)1、目录--------------------------------------------------------------22、实验目的--------------------------------------------------------33、实验要求--------------------------------------------------------34、实验仪器设备与材料-----------------------------------------35、实验原理--------------------------------------------------------46、实验步骤--------------------------------------------------------57、实验原始记录--------------------------------------------------68、实验数据分析计算结果--------------------------------------109、实验心得体会--------------------------------------------------1110、思考题----------------------------------------------------------12二:实验目的:对一个合法的中缀表达式求值。
简单起见,假设表达式只包含+,-,*,÷等4个双目运算符,且运算符本身不具有二义性,操作数均为一位数整。
三:要求:1、正确解释表达式2、符合四则运算规格3、输出最后的计算结果四:实验仪器设备与材料参考书籍电脑及其配件Microsoft Visulai C++ 6.0五:实验原理对中缀表达式求值,通常使用“酸腐优先算法”。
根据四则运算规则,在运算的每一步中,任意两个相继出班的运算符t和c之间的优先关系至多是下面三种关系之一:1、t的优先级低于c2、t的优先级高于c3、t的优先级高于c为实现算符优先算法,可以使用两个工作栈:一个栈存放运算符;另一个栈存放操作数,中缀表达式用一个字符串数组存储。
六:实验步骤1、基本操作:Initialization()操作结果:构造链栈tran()初始条件:链栈已经存在操作结果:将中缀表达式转化为后缀表达式Sum()初始条件:链栈已经存在并且中缀表达式已经转化为后缀表达式操作结果:求出表达式的值2、程序包括三个模块:(1)装程序模块(2)构造链栈模块(3)表达式转换模块(4)表达式求职模块最后测试数据:输入表达式,以#结束:后缀表达式为:输出后缀表达式计算结果为:输出计算结果七:实验原始记录s truct node{char datat;int num;struct node*next;};V oid main(){Struct node*top,*head;Top=initialization();Printf("请输入表达式,以#结束:\n");Gets(stringl);Head=tran(top);Sum(head);}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*p,*top;Int i;To p=s;Int m;Char a;M=strlen(string1);For(i=0;i<=m;i++){a=string1[i];If('0'<=string1[i]&&string1[i]<='9'){String2[j]=string1[i];j++;}Else{Swith(a){Case'(':{P=(struct node*)malloc(sizeof(struct node));P->data=a;p->next=top;Top=p;Break;}case'*':case'/':String2[j]=' ';j++;If((top->data=='*')||(top->data=='/')){String2[j]=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'-':{String2[j]=' ';j++;If(top->data=='+'||top->data=='*'||top->data=='/'){String2[j]=top->data;j++;Top->data=a;Break:}}Case')':{String2[j]=' ';j++;If(top->data=''){printf("input error");break;)While(top->data!='('){String2[j]=top->data;j++;P=top;Top=top->next;Free(p):}P=top;top=->next;free(p);Break;}}}}While(top->data!=''){String2[j]=top->data;j++;P=top;Top=top->next;Free(p);}String2[j]='#';Printf(后缀表达式为:\n");For(i=0;i<j;i++)If(string2[i]!=' ')Printf("%c",string2[i]);Printf("\n");Return top;}Struct node *sum(struct node *s){Struct node *top,*p;Char *q;Int x,y,a;Int i,n;Top=s;For(i=0;i<=j;i++){If(string2[i]>='0'&&string2[i]<='9'){Q=&string2[i];A=atoi(q);For(n=i;string2[n]>='0'&&string2[n]<='9';n++){}P=(struct node *)malloc(sizeof(struct node ));P->num=a;p->next=top;top=p;I=n-1;}ElseIf(string2[i]=='#')Printf("计算结果为:\n%d\n",top->num);Else{If(string2[i]==' '){}Else{Y=top->num;p=top;top=top->next;free(p);X=top->num;p=top;top=top->next;free(p);Switch(string2[i]){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=x*y;P=(struct node *)malloc(sizeof(struct node ));P->num=a;p->next=top;top=p;Break;}Case'/':{if(y==0)Printf("ERROR:除数为零!\n");A=(float)x/y:P=(struct node *)malloc(sizeof(struct node ));P->num=a;p->next=top;top=p;Break;}}}}}Return o;}八:实验数据分析计算结果第一组:输入:中缀表达式为:1+2*3+4#输出:后缀表达式为:123*+4+,计算结果为11 第二组:输入:中缀表达式为:1+2*(3+4)+5#输出:后缀表达式为:1234+*+5+,计算结果为20分析正确。
九:实验心得、体会这次实验设计让我更加了解大一学到的 C 和这个学期学到的数据结构.课设题目要求不仅要求对课本知识有较深刻的了解, 同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧. 这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨, 如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。
实验设计时, 也不要怕遇到错误, 在实际操作过程中犯的一些错误还会有意外的收获, 感觉实验设计很有意思。
在具体操作中这学期所学的数据结构的理论知识得到巩固, 达到实验设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到 C 语言具有的语句简洁,使用灵活,执行效率高等特点.发现上机的重要作用,特别算术表达式有了深刻的理解。