表达式相等判断.docx
- 文档编号:26691250
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:12
- 大小:106.42KB
表达式相等判断.docx
《表达式相等判断.docx》由会员分享,可在线阅读,更多相关《表达式相等判断.docx(12页珍藏版)》请在冰豆网上搜索。
表达式相等判断
安阳工学院
表达式相等判断
班级:
09级计算机科学与信息工程院
日期:
2011/11/26
一.问题描述:
任给两个表达式都满足下面的性质,判断它们是否相等。
(1)表达式只可能包含一个变量“a”。
(2)表达式中出现的数据都是正整数,而且都小于10000。
(3)表达式中可以包括4种运算“+”,“-”,“*”,“^”以及小括号“(”,“)”小括号的优先级最高,其次是“^”,然后是“*”,最后是“+”和“-”。
“+”和“-”的优先级是相同的。
相同优先级的运算从左到右进行。
(4)幂指数只可能是1到10之间的正整数。
(5)表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1)^2)^3a*a+a-a((a+a))9999+(a-a)*a
1+(a-1)^31^10^9
二.问题分析
以字符序列的形式从终端输入语法正确的整数表达式,利用给定的运算符优先关系,实现对表达式的求值。
在求值的过程中运算符栈,操作数栈,输入字符和主要操作。
表达式相等判断首先要对表达式处理就要先申请空间利用栈的性质来存储表达式然后建立函数用运算符栈和运算数栈的存取功能和运算符的优先级功能来求表达式的值。
三.数据结构设计
四.算法设计
(1)先确定算数表达式求值的运算符优先算法。
(2)设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。
(3)先将数组制空,再将单个数连接到数组中形成字符串。
(4)如果遇到运算符则将字符串数组转化成实数,入栈并重新制空。
(5)不是运算符则进栈,栈顶元素优先权低,脱括号并接受下一字符,退栈并将结果入栈。
五.程序设计
#include
#include
#include
#include
#defineerror0
#defineok1
#defineoverflow-1
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineOPSETSIZE7
charOPSET[OPSETSIZE]={'+','-','*','^','(',')','#'};
unsignedcharPrior[7][7]={//运算符间的优先关系
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','<','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','',
'>','>','>','>','','>','>',
'<','<','<','<','<','','='
};
typedefintStatus;
template
structSqStack
{
T*top;
T*base;
intstacksize;
};//顺序栈结构模板
template
StatusInitStack(T1&S)
{
S.base=(T2*)malloc(STACK_INIT_SIZE*sizeof(T2));
if(!
S.base)exit(overflow);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnok;
}//初始化栈函数模板
template
StatusPush(T1&S,T2e)
{
if(S.top-S.base>=S.stacksize)
{S.base=(T2*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));
if(!
S.base)exit(overflow);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnok;
}//入栈函数模板
template
StatusPop(T1&S,T2&e)
{
if(S.top==S.base)returnerror;
e=*--S.top;
returnok;
}//出栈函数模板
template
T2GetTop(T1S)
{
if(S.top==S.base)
returnerror;
else
return*(S.top-1);
}//获取栈顶元素模板
StatusIn(charTest,char*TestOp){
boolFind=false;
for(inti=0;i if(Test==TestOp[i])Find=true; } returnFind; }//判断是否为运算符 intOperate(inta,unsignedchartheta,intb){ switch(theta){ case'+': returna+b; case'-': returna-b; case'*': returna*b; case'^': returnpow(a,b); default: return0; } }//运算 intReturnOpOrd(charop,char*TestOp){ inti; for(i=0;i if(op==TestOp[i])returni; } return0; } charprecede(charAop,charBop){ returnPrior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]; }//ReturnOpOrd和precede组合,判断运算符优先级 intEvaluateExpression1(){ //算术表达式求值的算符优先算法。 //设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。 SqStack SqStack charTempData[20]; intData,a,b; chartheta,c,x,Dr[2]; InitStack Push(OPTR,'#'); InitStack strcpy(TempData,"\0");//将TempData置为空 c=getchar(); while(c! ='#'||GetTop ='#') { if(! In(c,OPSET)) { Dr[0]=c; Dr[1]='\0';//存放单个数 strcat(TempData,Dr);//将单个数连到TempData中,形成字符串 c=getchar(); if(In(c,OPSET))//如果遇到运算符,则将字符串TempData转换成实数,入栈,并重新置空 { Data=(int)atof(TempData); Push(OPND,Data); strcpy(TempData,"\0"); } } else {//不是运算符则进栈 switch(precede(GetTop case'<': //栈顶元素优先权低 Push(OPTR,c); c=getchar(); break; case'=': //脱括号并接收下一字符 Pop(OPTR,x); c=getchar(); break; case'>': //退栈并将运算结果入栈 Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; }//switch } }//while returnGetTop }//EvaluateExpression intEvaluateExpression2(){ //算术表达式求值的算符优先算法。 //设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。 SqStack SqStack charTempData[20]; intData,a,b; chartheta,c,x,Dr[2]; InitStack Push(OPTR,'#'); InitStack strcpy(TempData,"\0");//将TempData置为空 c=getchar(); while(c! ='#'||GetTop ='#') { if(! In(c,OPSET)) { Dr[0]=c; Dr[1]='\0';//存放单个数 strcat(TempData,Dr);//将单个数连到TempData中,形成字符串 c=getchar(); if(In(c,OPSET))//如果遇到运算符,则将字符串TempData转换成实数,入栈,并重新置空 { Data=(int)atof(TempData); Push(OPND,Data); strcpy(TempData,"\0"); } } else {//不是运算符则进栈 switch(precede(GetTop case'<': //栈顶元素优先权低 Push(OPTR,c); c=getchar(); break; case'=': //脱括号并接收下一字符 Pop(OPTR,x); c=getchar(); break; case'>': //退栈并将运算结果入栈 Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; }//switch } }//while returnGetTop }//EvaluateExpression voidmain() { printf("请输入表达式(end#): \n"); if(EvaluateExpression1()==EvaluateExpression2()) printf("两个表达式相等"); else printf("两个表达式不相等\n"); } 六.运行结果 七.结论分析 利用栈可以解决那些特殊的输入问题,利用栈还可以使算法解决一些复杂的多重输入更加方便。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 表达式 相等 判断