表达式求值.docx
《表达式求值.docx》由会员分享,可在线阅读,更多相关《表达式求值.docx(10页珍藏版)》请在冰豆网上搜索。
表达式求值
结果截图:
源代码:
#include
#include
intk;
typedefintSElemType;
#defineSTACK_INIT_SIZE10
#defineSTACKINCREMENT2
typedefstructSqStack
{
SElemType*base;//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;//栈顶指针
intstacksize;//当前已分配的存储空间,以元素为单位
}SqStack;//顺序栈
//构造一个空栈S。
intInitStack(SqStack*S)
{
//为栈底分配一个指定大小的存储空间
(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
(*S).base)
exit(0);//存储分配失败
(*S).top=(*S).base;//栈底与栈顶相同表示一个空栈
(*S).stacksize=STACK_INIT_SIZE;
return1;
}
//若栈不空,则用e返回S的栈顶元素,并返回1;否则返回0。
intGetTop(SqStackS,SElemType*e)
{
if(S.top>S.base)
{
*e=*(S.top-1);//栈顶指针的下一个位置为栈顶元素
return1;
}
else
return0;
}
//插入元素e为新的栈顶元素。
intPush(SqStack*S,SElemTypee)
{
if((*S).top-(*S).base>=(*S).stacksize)//栈满,追加存储空间
{
(*S).base=(SElemType*)realloc((*S).base,
((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
(*S).base)
exit(0);//存储分配失败
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*((*S).top)++=e;
//这个等式的++*优先级相同,但是它们的运算方式,是自右向左
return1;
}
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0。
intPop(SqStack*S,SElemType*e)
{
if((*S).top==(*S).base)
return0;
*e=*--(*S).top;
return1;
}
SElemTypePrecede(SElemTypet1,SElemTypet2)
{
SElemTypef;
switch(t2)
{
case'+':
case'-':
if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case'*':
case'/':
if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case'(':
if(t1==')')
{
printf("ERROR1\n");
exit(0);
}
else
f='<';
break;
case')':
switch(t1)
{
case'(':
f='=';
break;
case'=':
printf("ERROR2\n");
exit(0);
default:
f='>';
}
break;
case'=':
switch(t1)
{
case'=':
f='=';
break;
case'(':
printf("ERROR2\n");
exit(0);
default:
f='>';
}
}
returnf;
}
//判断c是否为运算符。
intIn(SElemTypec)
{
switch(c)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'=':
return1;
default:
return0;
}
}
SElemTypeOperate(SElemTypea,SElemTypetheta,SElemTypeb)
{
SElemTypec;
switch(theta)
{
case'+':
c=a+b;
break;
case'-':
c=a-b;
break;
case'*':
c=a*b;
break;
case'/':
c=a/b;
}
returnc;
}
//算术表达式求值的算符优先算法。
设OPTR和OPND分别为运算符栈和运算数栈
SElemTypeEvaluateExpression()
{
SqStackOPTR,OPND;
SElemTypea,b,d,x,theta;
charc;//存放由键盘接收的字符串
charz[6];//存放整数字符串
inti;
InitStack(&OPTR);//初始化运算符栈
Push(&OPTR,'=');//=是表达式结束标志
InitStack(&OPND);//初始化运算数栈
c=getchar();
GetTop(OPTR,&x);
while(c!
='='||x!
='=')
{
if(In(c))//是7种运算符之一
switch(Precede(x,c))
{
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));
}
elseif(c>='0'&&c<='9')//c是操作数
{
i=0;
do
{
z[i]=c;
i++;
c=getchar();
}while(c>='0'&&c<='9');
z[i]=0;
d=atoi(z);//将字符串数组转为整型存于d
Push(&OPND,d);
}
else//c是非法字符
{
//printf("ERROR3\n");
//exit(0);
}
GetTop(OPTR,&x);
}
GetTop(OPND,&x);
returnx;
}
voidspace()
{
printf("");
}
voidspace1()
{
printf("");
}
voidstar()
{
printf("*****************************************");
}
voidsizemain()
{
voidspace1();
voidstar();
star();
printf("\n\n");
space1();
printf("四则运算演示\n");
printf("\n\n");
star();
printf("\n请输入算术表达式,负数要用(0-正数)表示,并以=结束:
\n");
printf("表达式结果:
%d\n",EvaluateExpression());
return0;
}
intmain()
{
voidsizemain();
sizemain();
return0;
}