数据结构表达式求值(可以求小数与多位数)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

=============================分页符(下一页)================================四、实验步骤#includestdafx.h#includeiostream.h#includestdlib.h#includemath.h#includemalloc.h#includeString#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10#defineOPSETSIZE7typedefintStatus;floatOperate(floata,chartheta,floatb);StatusIn(charTest,charTestOp[7]);charprecede(charAop,charBop);charOPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};typedefstruct{char*base;char*top;intstacksize;}SqStackOPTR;typedefstruct{float*base;float*top;intstacksize;}SqStackOPND;=============================分页符(下一页)================================StatusInitStackOPTR(SqStackOPTR&S){//初始化栈S.base=(char*)malloc(sizeof(char)*STACK_INIT_SIZE);if(!S.base){cout初始化失败;returnfalse;}else{S.top=S.base;S.stacksize=STACK_INIT_SIZE;returntrue;}}StatusInitStackOPND(SqStackOPND&S){//初始化栈S.base=(float*)malloc(sizeof(float)*STACK_INIT_SIZE);if(!S.base){cout初始化失败;returnfalse;}else{S.top=S.base;S.stacksize=STACK_INIT_SIZE;returntrue;}}voidPushOPTR(SqStackOPTR&S,chare){//栈顶压入一个运算符*S.top=e;=============================分页符(下一页)================================S.top++;}voidPushOPND(SqStackOPND&S,floate){//栈顶压入一个数*S.top=e;S.top++;}charPopOPTR(SqStackOPTR&S,char&e){//取栈顶元素--S.top;e=*S.top;returne;}floatPopOPND(SqStackOPND&S,float&e){//取栈顶元素--S.top;e=*S.top;returne;}StatusGetTopOPTR(SqStackOPTR&S,char&e){e=*(S.top-1);returne;}floatGetTopOPND(SqStackOPND&S,float&e){e=*(S.top-1);returne;}=============================分页符(下一页)================================unsignedcharPrior[7][7]={//算符间的优先关系'','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','=','','','','','','','','','','','','','','','='};floatEvaluateExpression(char*ex,intn1){//算法3.4//设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。SqStackOPTROPTR;//运算符栈,字符元素SqStackOPNDOPND;//运算数栈,实数元素floata,b,*h,add=0,num,m;inti=0,n=0,j,k,m1=0;chartheta,e,x,*H;h=newfloat[n1+1];H=newchar[n1+1];InitStackOPTR(OPTR);e='#';PushOPTR(OPTR,e);InitStackOPND(OPND);while(ex[i]!='#'||GetTopOPTR(OPTR,x)!='#'){k=1;if(ex[i]='0'&&ex[i]='9'||ex[i]=='.'){=============================分页符(下一页)================================H[k]=ex[i];k++;for(k,j=i+1;ex[j]!='#';j++){if(ex[j]='0'&&ex[j]='9'||ex[j]=='.'){H[k]=ex[j];k++;}elsebreak;}//forfor(i=1;ik;i++)if(H[i]=='.')m1=i;if(m1=1)for(i=1;ik;i++){add=add*10+float(H[i]-48);}else{for(i=1;im1;i++){add=add*10+float(H[i]-48);}for(i=m1+1;ik;i++){num=pow(10,m1-i)*float(H[i]-48);add+=num;}}PushOPND(OPND,add);add=0;i=j;}else{//不是运算符则进栈switch(precede(GetTopOPTR(OPTR,x),ex[i])){=============================分页符(下一页)================================case''://栈顶元素优先权低PushOPTR(OPTR,ex[i]);i++;break;case'='://脱括号并接收下一字符PopOPTR(OPTR,x);i++;break;case''://退栈并将运算结果入栈PopOPTR(OPTR,theta);PopOPND(OPND,b);PopOPND(OPND,a);m=Operate(a,theta,b);PushOPND(OPND,m);break;}//switch}//els}//whilereturnGetTopOPND(OPND,m);}//EvaluateExpressionfloatOperate(floata,chartheta,floatb){switch(theta){case'+':returna+b;break;case'-':returna-b;break;case'*':returna*b;break;case'/':returna/b;break;=============================分页符(下一页)================================default:return0;break;}}StatusIn(charTest,charTestOp[7]){boolstatus=false;for(inti=0;iOPSETSIZE;i++){if(Test==TestOp[i])status=true;}returnstatus;}intReturnOpOrd(charop,charTestOp[7]){inti,n=0;for(i=0;iOPSETSIZE;i++){if(op==TestOp[i])n=i;}returnn;}charprecede(charAop,charBop){returnPrior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}voidmain(){inti,n,C=1;char*p;=============================分页符(下一页)================================while(C==1){cout请输入表达式的长度(包括#):;cinn;p=newchar[n];cout请输入表达式(以#结束):;for(i=0;in;i++)cinp[i];cout运算结果是:;for(i=0;in-1;i++)coutp[i];cout=EvaluateExpression(p,n)endl;cout是否继续?(1:继续;0:结束)endl;cinC;}}五、实验结果及分析=============================分页符(下一页)================================六、实验总结通过本次实验学到了许多东西,首先编写程序要有耐心,期间有好几次都想到要放弃了,算法是正确的,但结果总是错误。但静下心来仔细考虑才发现是一个小错误、小失误导致。所以说耐心很重要。同时,和同学们探讨也是一个不错的方法,毕竟每个人都有自己的方法,通过彼此学习可以互补。同时,要善于利用网上的资源,许多不清楚而知识可以在网上找到答案,这也是一个不错的学习方法。最后:实践出真知。七、教师评语和成绩=============================分页符(下一页)================================教师签名:年月日

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功