表达式求值.docx
- 文档编号:24693746
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:10
- 大小:109.99KB
表达式求值.docx
《表达式求值.docx》由会员分享,可在线阅读,更多相关《表达式求值.docx(10页珍藏版)》请在冰豆网上搜索。
表达式求值
表达式求值
计算机科学与技术学院实验课程
实验报告二
实验课名称:
数据结构与程序设计实验
实验名称:
表达式求值
实验类型:
综合性实验
班级:
20130641
学号:
2013064103
姓名:
樊威
时间:
2015.5.17
1、问题描述
表达式是数据运算的基本形式。
人们的书写习惯是中缀式,如:
11+22*(7-4)/3。
中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。
表达式还有后缀式(如:
2274-*3/11+)和前缀式(如:
+11/*22–743)。
后缀表达式和前缀表达式中没有括号,给计算带来方便。
如后缀式计算时按运算符出现的先后进行计算。
本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。
基本要求
●从文件或键盘读入中缀表达式。
●设计操作数为多位整数,操作符为加、减、乘、除、求模的中缀表达式求值算法。
●设计将中缀表达式转换为后缀表达式的算法。
●设计将中缀表达式转换为前缀表达式的算法。
●设计后缀表达式求值算法。
●设计前缀表达式求值算法。
●输出各种形式的表达式。
2、数据结构设计
任何一个表达式都是由操作符,运算符和界限符组成的。
我们分别用顺序栈来寄存表达式的操作数和运算符。
栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插除。
5.重复上述操作2直至扫描结束,将栈内剩余运算符全部出栈并输出。
6.再逆序输出字符串。
中缀表达式就转换为前缀表达式了。
(4)后缀表达式求值
1.从左到右读入后缀表达式
2.如果字符是一个操作数,把它压入栈。
3.如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。
4.到后缀表达式末尾,从堆栈中弹出结果。
若后缀表达式格式正确,那么堆栈应该为空。
(5)前缀表达式求值
1.从右至左扫描中缀表达式,从右边第一个字符开始判断,
2.如果当前字符是数字,则分析到数字串的结尾并将数字入栈。
3.如果是运算符,则将栈中最上面两个数字弹出并进行相应的运算。
结果入栈。
4.一直扫描到表达式的最左端时,最后栈中的值也就是表达式的值。
4、界面设计
界面如图:
五、主要操作
对数字栈的操作和对字符栈的操作类似,以下只写出对字符栈的操作。
//构建一个字符空栈
statusinitstack(charstack&s)
{
s.base=(char*)malloc(stack_init_size*sizeof(char));
if(!
s.base)exit(-2);//如果地址申请失败,退出
s.top=s.base;//栈顶栈尾指向同一位置
s.charstacksize=stack_init_size;
cout<<"准备完毕,请输入表达式:
"< return1; } //用e返回字符栈顶的元素 chargettop(charstacks) {chare; if(s.top==s.base)return0; e=*(s.top-1); returne; } //字符入字符栈 statuspush(charstack&s,chare) { if(s.top-s.base>=s.charstacksize) { s.base=(char*)realloc(s.base,(s.charstacksize+stackincrement)*sizeof(char)); if(s.base)exit(-2); s.top=s.base+s.charstacksize; s.charstacksize+=stackincrement; } *s.top++=e; return1; } //出字符站,用e返回 statuspop(charstack&s,char&e) { if(s.top==s.base)return0; e=*--s.top; return1; } //出字符站 statuspop(charstack&s) { if(s.top==s.base)return0; --s.top; return1; } //判断运算符优先级 charprecede(chara,charb) { charyouxian[9][9]={{'0','+','-','*','/','(',')','%','='}, {'+','>','>','<','<','<','>','<','>'}, {'-','>','>','<','<','<','>','<','>'}, {'*','>','>','>','>','<','>','>','>'}, {'/','>','>','>','>','<','>','>','>'}, {'(','<','<','<','<','<','=','<',''}, {')','>','>','>','>','','>','>','>'}, {'%','>','>','>','>','<','>','>','>'}, {'=','<','<','<','<','<','','<','='} }; inti,j; for(j=0;j<9;j++) { if(youxian[0][j]==b)break; }; for(i=0;i<9;i++) { if(youxian[i][0]==a)break; }; returnyouxian[i][j]; } //判断ch是否是运算符 intin(charch) { charptr[10]={'+','-','*','/','(',')','%','='}; inti; for(i=0;i<8;i++) { if(ch==ptr[i]) return1; } return0; } //计算二元表达式的值 intoperate(intaa,charthetaa,intbb) { intcc; if((thetaa=='/'||thetaa=='%')&&bb==0) {cout<<"输入有误! "< if(thetaa=='+') cc=aa+bb; elseif(thetaa=='-') cc=aa-bb; elseif(thetaa=='*') cc=aa*bb; elseif(thetaa=='/') cc=aa/bb; elsecc=aa%bb; returncc; } 六、运行测试与分析 (1)中缀表达式求值 1 求值 2 容错检验 (2)中缀表达式变后缀表达式 (3)中缀表达式变前缀表达式 (4)后缀表达式求值 (5)前缀表达式求值 七、实验收获与思考 1.能够将中缀表达式变成前缀表达式和后缀表达式。 2.对各类表达式都可以进行求值。 教师评分: 教师签字:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 表达式 求值