您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 中缀 >

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

发布时间:2019-07-29 20:37 来源:未知 编辑:admin

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  include#include#include//判断是否为字符的函数的头文件#definemaxsize100typedefintelemtype;typedefstructsqstacksqstack;//由于sqstack不是一个类型而structsqstack才是charch[7]=;//把符号转换成一个字符数组intf1[7]=;//栈内元素优先级intf2[7]=;//栈外的元素优先级=0){printf(underflown);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,Pop(&OPND,Pop(&OPND,//注意这里是谁先出栈Push(&OPND,Operate(a,theta,b));break;}}}//在这里判断是否以运算符结束是不对的return(Gettop(OPND));}main(){intresult;printf(输入你的算术表达式:n);result=EvaluateExpression();printf(结果是:%dn,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)return47)a=atoi(if(b47)b=atoi(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)、设立操作数栈和运算符栈,设表达式结束的标志是字符#,运算符栈底初始化为#,约定#运算符的优先级最小(这样做的目的是在当两个#相遇时就可以确定表达式扫描结束了)。

  2)、若当前扫描到的是操作数则果断将此数压栈进操作数栈,如果当前是符号栈则将该操作符和栈顶操作符进行优先级比较如果低于栈顶优先级则将操作符栈顶元素弹出并弹出两个操作数进行运算,运算完毕将结果压入栈中。如果当前符号的优先级高于栈顶优先级则将此运算符入栈。

http://herdesignsnj.com/zhongzhui/275.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有