//main.cpp
#include "predefined.h"
#include "SqStack.h"
SElemType EvaluateExpression();
SElemType GetTop_OPTR(SqStack S);
Status In(SElemType c);
SElemType Precede(SElemType c1,SElemType c2);
SElemType Operate(SElemType a,SElemType c,SElemType b);
int main()
{
SElemType result;
printf("请输入表达式:");
result=EvaluateExpression();
printf("=%c",result);
return 0;
}
SElemType EvaluateExpression()
//算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈,
//OP为运算符集合。
{
SqStack OPTR,OPND;
InitStack(&OPTR);
InitStack(&OPND);
Push(&OPTR,'#');
SElemType a,b,c,d;
c=getchar();
while(c!='#'||GetTop_OPTR(OPTR)!='#')
{
if(!In(c))
{
Push(&OPND,c);
c=getchar();
}
else
{
switch(Precede(GetTop_OPTR(OPTR),c))
{
case '>':Pop(&OPTR,&d);
Pop(&OPND,&b);
Pop(&OPND,&a);
Push(&OPND,Operate(a,d,b));
break;
case '<':Push(&OPTR,c);c=getchar();break;
case '=':Pop(&OPTR,&c);c=getchar();break;
}
}
}
return GetTop_OPTR(OPND);
}
SElemType GetTop_OPTR(SqStack S)
{
if(StackEmpty(S)) return ERROR;
return *((S).top-1);
}
Status In(SElemType c)
{
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':return TRUE;
default:return FALSE;
}
}
SElemType Precede(SElemType c1,SElemType c2)
{
SElemType f;
switch(c1)
{
case '+':
case '-':if(c2=='*'||c2=='/'||c2=='(') f='<';
else f='>';break;
case '*':
case '/':if(c2=='(') f='<';
else f='>';break;
case '(':if(c2==')') f='=';
else if(c2=='#')
{
printf("输入错误!!!\n");
exit(ERROR);
}
else f='<';break;
case ')':if(c2=='(')
{
printf("输入错误!!!\n");
exit(ERROR);
}
else f='>';
case '#':if(c2==')')
{
printf("输入错误!!!\n");
exit(ERROR);
}
else if(c2=='#')
f='=';
else
f='<';
break;
}
return f;
}
SElemType Operate(SElemType a,SElemType c,SElemType b)
{
SElemType x=a-48;
SElemType y=b-48;
switch(c)
{
case '+':return (x+y+48);
case '-':return (x-y+48);
case '*':return (x*y+48);
case '/':return (x/y+48);
}
}