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!
温馨提示:答案为网友推荐,仅供参考