数据结构程序设计作业——《表达式求值》.doc

数据结构程序设计作业——《表达式求值》.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构程序设计作业——《表达式求值》

数据结构实验报告 题  目  表达式求值     学生姓名  王某某       专业班级  测控120X班    学 号  U2012XXXXX     1 问题描述 输入一数学表达式,计算其值。表达式中数据位浮点数,包含加、减、乘、除、乘幂和取模运算,且有嵌套括号。规定加法运算符为‘+’,减法为‘-’,乘法为‘*’,除法‘\’,乘幂为‘^’,取模为‘%’。规定输入中运算符与数字之间有一空格,浮点正数不加符号,负数在前面加‘-’。表达式最后要加‘=’。 2??算法设计? 1. Precede(char c1,char c2) 判断运算符优先权,返回优先权高的。 算符间的优先关系如下: + - * / ( ) # + - * / ( = ) # = 表 1 算法代码如下: char Precede(char c1,char c2) { static char array[49]={ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , =, !, , , , , !, , , , , , , , !, =}; //用一维数组存储49种情况 switch(c1) { /* i为下面array的横标 */ case + : i=0;break; case - : i=1;break; case * : i=2;break; case / : i=3;break; case ( : i=4;break; case ) : i=5;break; case # : i=6;break; } switch(c2) { /* j为下面array的纵标 */ case + : j=0;break; case - : j=1;break; case * : j=2;break; case / : j=3;break; case ( : j=4;break; case ) : j=5;break; case # : j=6;break; } return (array[7*i+j]); /* 返回运算符array[7*i+j]为对应的c1,c2优先关系*/ } 2. int EvalExpr()主要操作函数。算法概要流程图: 利用该算法对算术表达式3*(7-2)求值操作过程如下: 步骤 OPTR栈 OPND栈 输入字符 主要操作 1 # 3*(7-2)# Push(OPND,’3’) 2 # 3 *(7-2)# Push(OPTR,’*’) 3 #* 3 (7-2)# Push(OPNR,’(’) 4 #*( 3 7-2)# Push(OPND,’7’) 5 #*( 3 7 -2)# Push(OPNR,’-’) 6 #*(- 3 7 2)# Push(OPND,’2’) 7 #*(- 3 7 2 )# Operate(‘7’,’-’,’2’) 8 #*( 3 5 )# Pop(OPTR) 9 #* 3 5 # Operate(‘3’,’*’,5’) 10 # 15 # Return(GetTop2(OPND)) 表2 算法代码如下: int EvalExpr()//主要操作函数 { c = *ptr++; while(c!=#||GetTop(OPTR)!=#) { if(!In(c)) //不是运算符即进栈 { if(!In(*(ptr-1))) ptr=ptr-1; m=atoi(ptr);//取字符串前面的数字段 n=num(m); Push2(OPND,m); ptr=ptr+n; c=*ptr++; } else switch(Precede(GetTop(OPTR),c)) { case : //栈顶元素优先权底 Push(OPTR,c); c = *ptr++; break; case =: //脱括号并接收下一字符 x=Pop(OPTR); c = *ptr++; break; case ://退栈并将运算结果入栈 theta=Pop(OPTR); b=Pop2(OPND); a=Pop2(OPND); Push2(OPND,Operate(a,theta,b)); break; } } 3 程序设计 因为表达式是由操作符,运算符和界限符组成的。如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。? /*

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档