C++实现中缀表达式求值代码

如题所述

include#include#include//判断是否为字符的函数的头文件#definemaxsize100typedefintelemtype;typedefstructsqstacksqstack;//由于sqstack不是一个类型而structsqstack才是charch[7]=;//把符号转换成一个字符数组intf1[7]=;//栈内元素优先级intf2[7]=;//栈外的元素优先级structsqstack{elemtypestack[maxsize];inttop;};voidInitstack(sqstack*s){s->top=0;}voidPush(sqstack*s,elemtypex){if(s->top==maxsize-1)printf("Overflow\n");else{s->top++;s->stack[s->top]=x;}}voidPop(sqstack*s,elemtype*x){if(s->top==0)printf("underflow\n");else{*x=s->stack[s->top];s->top--;}}elemtypeGettop(sqstacks){if(s.top==0){printf("underflow\n");return0;}elsereturns.stack[s.top];}elemtypef(charc){switch(c){case'+':return0;case'-':return1;case'*':return2;case'/':return3;case'(':return4;case')':return5;default:return6;}}charprecede(charc1,charc2){inti1=f(c1);inti2=f(c2);//把字符变成数字if(f1[i1]>f2[i2])//通过原来设定找到优先级return'>';elseif(f1[i1]':Pop(&OPTR,&theta);Pop(&OPND,&b);Pop(&OPND,&a);//注意这里是谁先出栈Push(&OPND,Operate(a,theta,b));break;}}}//在这里判断是否以运算符结束是不对的return(Gettop(OPND));}main(){intresult;printf("输入你的算术表达式:\n");result=EvaluateExpression();printf("结果是:%d\n",result);return0;}:本计算器利用堆栈来实现。1、定义后缀式计算器的堆栈结构因为需要存储的单元不多,这里使用顺序栈,即用一维数组来模拟堆栈:#defineMAX100intstack[MAX];inttop=0;因此程序中定义了长度为MAX的一维数组,这里MAX用宏定义为常数100,我们可以修改宏定义而重新定义堆栈的大小。整型数据top为栈顶指示,由于程序开始时堆栈中并无任何数据元素,因此top被初始化为0。2、存储后缀式计算器的运算数我们定义了堆栈stack[MAX]后,就可以利用入栈操作存储先后输入的两个运算数。下面看一下是如何实现的:intpush(inti)/*存储运算数,入栈操作*/{if(top#include#include#defineERR-1#defineMAX100/*定义堆栈的大小*/intstack[MAX];/*用一维数组定义堆栈*/inttop=0;/*定义堆栈指示*/intpush(inti)/*存储运算数,入栈操作*/{if(top#include#include#include#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus;#defineSTACK_INIT_SIZE100//初始分配量#defineSTACKINCREMENT10//存储空间的分配增量typedefcharElemType;typedefElemTypeOperandType;//操作数typedefcharOperatorType;typedefstruct{ElemType*base;ElemType*top;intstacksize;}SqStack;StatusInitStack(SqStack&S){//构造一个空栈SS.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;}StatusGetTop(SqStackS){ElemTypee;if(S.top==S.base)returnERROR;e=*(S.top-1);returne;}StatusPush(SqStack&S,ElemTypee){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;returnOK;}StatusPop(SqStack&S,ElemType&e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*--S.top;returnOK;}charIn(charc,charOP[]){if(c>=35&&c2';elseif(m[a][b]==2)return'47)a=atoi(&a);if(b>47)b=atoi(&b);switch(theta){case'+':returna+b;break;case'-':returna-b;break;case'*':returna*b;break;case'/':returna/b;break;}}OperandTypeEvaluateExpression(){SqStackOPTR,OPND;OperandTypea,b,c;OperatorTypetheta;InitStack(OPTR);Push(OPTR,'#');InitStack(OPND);c=getchar();while(c!='#'||GetTop(OPTR)!='#'){if(!In(c,OP))elseswitch(Precede(GetTop(OPTR),c)){case'':Pop(OPTR,theta);Pop(OPND,b);Pop(OPND,a);Push(OPND,Operate(a,theta,b));break;}}returnGetTop(OPND);}voidmain(){printf("(以#为结束符)\n");printf("请输入:\n");inta;a=(int)EvaluateExpression();printf("%d",a);getch();}:ls都正确:C++InAction这本书里面有表达式求值的详细项目分析.:数据结构的书里面都有的,仔细看一下:studyall123的只能对0到9的数字运算才有效,对于10以上的数字就不行!不知道有没有更好的方法!:现在的人,连google一下都懒啊:实际上是按照逆波兰式的顺序让输入的表达式入栈,再根据运算符优先级来计算。:lenrning!
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-04-08
1)、设立操作数栈和运算符栈,设表达式结束的标志是字符#,运算符栈底初始化为#,约定#运算符的优先级最小(这样做的目的是在当两个#相遇时就可以确定表达式扫描结束了)。
2)、若当前扫描到的是操作数则果断将此数压栈进操作数栈,如果当前是符号栈则将该操作符和栈顶操作符进行优先级比较如果低于栈顶优先级则将操作符栈顶元素弹出并弹出两个操作数进行运算,运算完毕将结果压入栈中。如果当前符号的优先级高于栈顶优先级则将此运算符入栈。
3)、循环操作2直到输入的表达式运算结束(运算符栈底的#和输入的表达式的#相遇)此时如若操作数栈中只剩一个数字则表示运算成功,此数就是表达式的结果,如果不止一个数则表示输入的表达式有误。本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网