编译原理实验三 逆波兰式的产生及计算.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:4 大小:60KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

编译原理实验三 逆波兰式的产生及计算.doc

编译原理实验三逆波兰式的产生及计算.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验三逆波兰式的产生及计算一、实验目的:将用中缀式表示的算术表达式转换为用逆波兰式表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。二、实验内容:1.定义部分:定义常量、变量、数据结构。2.初始化:设立算符优先分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);3.控制部分:从键盘输入一个表达式符号串;4.利用算符优先分析算法进行表达式处理:根据算符优先分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。5.对生成的逆波兰式进行计算。三、实验要求:输入如下:21+((42-2)*15+6)-18#输出如下:原来表达式:21+((42-2)*15+6)-18#后缀表达式:21&42&2&-15&*6&++18&-计算结果:609四、实验源程序:#include<stdio.h>#include<math.h>#definemax100charex[max];voidtrans(){charstr[max];charstack[max];charch;intsum,i,j,t,top=0;printf("请输入一个求值的表达式,以#结束。\n");printf("算数表达式:");i=0;/*输入表达式*/do{i++;scanf("%c",&str[i]);}while(str[i]!='#'&&i!=max);sum=i;t=1;i=1;ch=str[i];i++;while(ch!='#'){switch(ch){/*判定为左括号*/case'(':top++;stack[top]=ch;//入栈break;/*判定为右括号*/case')':while(stack[top]!='('){//栈顶不为'('时ex[t]=stack[top];top--;t++;}top--;break;//栈顶为'(',退栈/*运算符*//*判定为加减号*/case'+':case'-':while(top!=0&&stack[top]!='('){ex[t]=stack[top];top--;t++;/*stack[]为运算符ω栈*/}top++;stack[top]=ch;break;/*判定为乘除号*/case'*':case'/':while(stack[top]=='*'||stack[top]=='/'){ex[t]=stack[top];top--;t++;}top++;stack[top]=ch;break;case'':break;/*判定为数字*/default:while(ch>='0'&&ch<='9'){ex[t]=ch;t++;/*ex[]中存放逆波兰式*/ch=str[i];i++;/*str[]中存放中缀表达式*/}i--;ex[t]='&';t++;break;}ch=str[i];i++;}/*当中缀表达式扫描完毕,检查ω栈是否为空,若不空则一一退栈*/while(top!=0){ex[t]=stack[top];t++;top--;}ex[t]='#';printf("\n\t原来表达式:");for(j=1;j<sum;j++)printf("%c",str[j]);printf("\n\t后缀表达式:",ex);for(j=1;j<t;j++)printf("%c",ex[j]);}voidcompvalue(){floatstack[max],d;charch;intt=1,top=0;ch=ex[t];t++;while(ch!='#'){switch(ch){case'+':stack[top-1]=stack[top-1]+stack[top];top--;break;case'-':stack[top-1]=stack[top-1]-stack[top];top--;break;case'*':stack[top-1]=stack[top-1]*stack[top];top--;break;case'/':if(stack[top]!=0)stack[top-1]=stack[top-1]/stack[top];else{printf("\n\t除零错误!\n");break;/*异常退出*/}top--;break;/*将数字字符转化为对应的数值*/