1、利用栈求表达式的值题目:利用栈求表达式的值一设计任务和目标编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。主要功能描述如下:1、从键盘上输入表达式。2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。(3)若是其它字符,则返回错误信息。主要功能描述如下:1、从键盘上输入表达式。2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。(3)
2、若是其它字符,则返回错误信息。程序应包括以下几个功能函数voidinitstack();初始化堆栈intMake_str();语法检查并计算intpush_operate(intoperate):将操作码压入堆栈intpush_num(doublenum):将操作数压入堆栈intprocede(intoperate):处理操作码intchange_opnd(intoperate):将字符型操作码转换成优先级intpush_opnd(intoperate):将操作码压入堆栈intpop_opnd();将操作码弹出堆栈intcaculate(interru_opnd):简单计算+,-,*,/dou
3、blepop_num():弹出操作数程序如下:#includestdio.h#includestring.h#includestdlib.h#defineMAXLEN100typedefstructcharop;intlevel;opt;typedefstruct/定义操作符栈optstMAXLEN;inttop;op_stack;typedefstruct/定义值栈doubleDMAXLEN;inttop;D_stack;/-对栈操作的定义-optpeek(op_stack*s)/定义看栈顶函数opterror=;if(s-top=0)returns-sts-top;elsereturner
4、ror;intIsEmpty(op_stack*s)/定义判断栈空的函数if(s-topsts-top.op;charpush(op_stack*s,optc)/定义入栈函数s-top+;s-sts-top=c;returnc.op;optpop(op_stack*s)/定义出栈函数opti;opterror=;if(s-top=0)i=s-sts-top;s-sts-top.op=0;s-top-;returni;elsereturnerror;voidclear(op_stack*s)/定义初始化栈s-top=-1;/-definethevaluestack-doubleDpeek(D_s
5、tack*s)/定义看栈顶函数if(s-top=0)returns-Ds-top;elsereturn0;intDIsEmpty(D_stack*s)/定义判断栈空的函数if(s-topDs-top);doubleDpush(D_stack*s,doublec)/定义入栈函数s-top+;s-Ds-top=c;returnc;doubleDpop(D_stack*s)/定义出栈函数doublei;if(s-top=0)i=s-Ds-top;s-Ds-top=0;s-top-;returni;elsereturn0;voidDclear(D_stack*s)/定义初始化栈s-top=-1;dou
6、blecalval(char*exp)op_stackos;/定义两个栈D_stackds;chartmpMAXLEN=;inti=0,leng;doubledtmp,dpoptmp;optA=;optR=;optM=;optD=;optB=;optMo=;clear(&os);Dclear(&ds);/-定义初始化结束-while(*exp!=0)while(*exp=0&*exp=0&*exp=9|*exp=.)tmpi+=*exp+;dtmp=atof(tmp);Dpush(&ds,dtmp);leng=strlen(tmp);for(i=0;ileng;i+)tmpi=0;i=0;/-
7、switch(*exp)case+:if(!IsEmpty(&os)|peek(&os).level=A.level)switch(pop(&os).op)case%:dpoptmp=Dpop(&ds);dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp);Dpush(&ds,dpoptmp);break;case*:dpoptmp=Dpop(&ds)*Dpop(&ds);Dpush(&ds,dpoptmp);break;case/:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)/dpoptmp;Dpush(&ds,dpoptmp);b
8、reak;case+:dpoptmp=Dpop(&ds)+Dpop(&ds);Dpush(&ds,dpoptmp);break;case-:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)-dpoptmp;Dpush(&ds,dpoptmp);break;push(&os,A);*exp+;break;case-:if(!IsEmpty(&os)|peek(&os).level=R.level)switch(pop(&os).op)case%:dpoptmp=Dpop(&ds);dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp);Dpu
9、sh(&ds,dpoptmp);break;case*:dpoptmp=Dpop(&ds)*Dpop(&ds);Dpush(&ds,dpoptmp);break;case/:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)/dpoptmp;Dpush(&ds,dpoptmp);break;case+:dpoptmp=Dpop(&ds)+Dpop(&ds);Dpush(&ds,dpoptmp);break;case-:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)-dpoptmp;Dpush(&ds,dpoptmp);break;push(&os,R
10、);*exp+;break;case*:if(!IsEmpty(&os)|peek(&os).level=M.level)switch(pop(&os).op)case%:dpoptmp=Dpop(&ds);dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp);Dpush(&ds,dpoptmp);break;case*:dpoptmp=Dpop(&ds)*Dpop(&ds);Dpush(&ds,dpoptmp);break;case/:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)/dpoptmp;Dpush(&ds,dpoptmp)
11、;break;push(&os,M);*exp+;break;case/:if(!IsEmpty(&os)|peek(&os).level=D.level)switch(pop(&os).op)case%:dpoptmp=Dpop(&ds);dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp);Dpush(&ds,dpoptmp);break;case*:dpoptmp=Dpop(&ds)*Dpop(&ds);Dpush(&ds,dpoptmp);break;case/:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)/dpoptmp;D
12、push(&ds,dpoptmp);break;push(&os,D);*exp+;break;case%:if(!IsEmpty(&os)|peek(&os).level=Mo.level)switch(pop(&os).op)case%:dpoptmp=Dpop(&ds);dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp);Dpush(&ds,dpoptmp);break;case*:dpoptmp=Dpop(&ds)*Dpop(&ds);Dpush(&ds,dpoptmp);break;case/:dpoptmp=Dpop(&ds);dpoptmp=D
13、pop(&ds)/dpoptmp;Dpush(&ds,dpoptmp);break;push(&os,Mo);*exp+;break;case(:push(&os,B);exp+;break;case):while(peek(&os).level!=-2)switch(pop(&os).op)case%:dpoptmp=Dpop(&ds);dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp);Dpush(&ds,dpoptmp);break;case*:dpoptmp=Dpop(&ds)*Dpop(&ds);Dpush(&ds,dpoptmp);break;c
14、ase/:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)/dpoptmp;Dpush(&ds,dpoptmp);break;case+:dpoptmp=Dpop(&ds)+Dpop(&ds);Dpush(&ds,dpoptmp);break;case-:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)-dpoptmp;Dpush(&ds,dpoptmp);break;pop(&os);/弹出(exp+;break;while(IsEmpty(&os)switch(pop(&os).op)case%:dpoptmp=Dpop(&ds);dpoptmp
15、=(float)(int)Dpop(&ds)%(int)dpoptmp);Dpush(&ds,dpoptmp);break;case*:dpoptmp=Dpop(&ds)*Dpop(&ds);Dpush(&ds,dpoptmp);break;case/:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)/dpoptmp;Dpush(&ds,dpoptmp);break;case+:dpoptmp=Dpop(&ds)+Dpop(&ds);Dpush(&ds,dpoptmp);break;case-:dpoptmp=Dpop(&ds);dpoptmp=Dpop(&ds)-dpoptmp;Dpush(&ds,dpoptmp);break;returnDpop(&ds);voidmain()charstringMAXLEN;char*p=string;printf(输入表达式:n);gets(p);printf(%s=%fnn,string,calval(p);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1