欢迎来到天天文库
浏览记录
ID:41127162
大小:60.00 KB
页数:4页
时间:2019-08-17
《编译原理实验三 逆波兰式的产生及计算》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验三逆波兰式的产生及计算一、实验目的:将用中缀式表示的算术表达式转换为用逆波兰式表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。二、实验内容: 1.定义部分:定义常量、变量、数据结构。2.初始化:设立算符优先分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);3.控制部分:从键盘输入一个表达式符号串;4.利用算符优先分析算法进行表达式处理:根据算符优先分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。5.对生成的逆波兰式进行计算。三、实验要求:输入如下:21+((42-2)*15+6)-18#输出如下:原来表达式:21+((42-
2、2)*15+6)-18#后缀表达式:21&42&2&-15&*6&++18&-计算结果:609四、实验源程序:#include#include#definemax100charex[max];voidtrans(){charstr[max];charstack[max];charch;intsum,i,j,t,top=0;printf("请输入一个求值的表达式,以#结束。");printf("算数表达式:");i=0;/*输入表达式*/do{i++;scanf("%c",&str[i]);}while(str[i]!='#'&&i!=max);sum=
3、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
4、[]为运算符ω栈*/}top++;stack[top]=ch;break;/*判定为乘除号*/case'*':case'/':while(stack[top]=='*'
5、
6、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
7、=str[i];i++;}/*当中缀表达式扫描完毕,检查ω栈是否为空,若不空则一一退栈*/while(top!=0){ex[t]=stack[top];t++;top--;}ex[t]='#';printf("t原来表达式:");for(j=1;j8、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("t除零错误!");break;/*异常退出*/}top--;break;9、/*将数字字符转化为对应的数值*/default:d=0;while(ch>='0'&&ch<='9'){d=10*d+ch-'0';ch=ex[t];t++;}top++;stack[top]=d;}ch=ex[t];t++;}printf("t计算结果:%g",stack[top]);}voidmain(){trans();compvalue();}五、实验运行结果:
8、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("t除零错误!");break;/*异常退出*/}top--;break;
9、/*将数字字符转化为对应的数值*/default:d=0;while(ch>='0'&&ch<='9'){d=10*d+ch-'0';ch=ex[t];t++;}top++;stack[top]=d;}ch=ex[t];t++;}printf("t计算结果:%g",stack[top]);}voidmain(){trans();compvalue();}五、实验运行结果:
此文档下载收益归作者所有