#include
#include
#include
#define STACK_INIT_SIZE 100 //栈
#define STACKINCREMENT 10 //栈的存储单位长度
#define OVERFLOWER -2 //定义
#define ERROR 0 //定义
#define OK 1 //定义
#define SElemType char //定义SElemType 为char类型
typedef int Status; //Status等同于int 定义
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;//数据结构的定义
Status InitStack(SqStack &S)//栈的初始化
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof (SElemType));//分配首地址
if(!S.base)exit(OVERFLOWER);//分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;//栈的大小
return(OK);
}
Status Push(SqStack &S,SElemType e)//进栈
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (SElemType));
if(!S.base)
exit(OVERFLOWER);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return(OK);
}
Status Pop(SqStack &S,SElemType &e)//出栈
{
if(S.top==S.base)
return (ERROR);
e=*--S.top;
return(OK);
}
SElemType GetTop(SqStack S)//取栈顶元素
{
SElemType e;
if(S.base==S.top)
return(ERROR);
e=*(S.top-1);
return (e);
}
Status In(SElemType c)//判断c是否为运算符
{
switch(c)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':
return (OK);
default:return (ERROR);
}
}
char Precede(char c1,char c2)//符号优先级别的判断
{
switch(c1)
{
case '+':
case '-':
if(c2=='*'||c2=='('||c2=='/')
return('<');
else
return('>');
break;
case'*':
case'/':
if(c2=='(')
return('<');
else return('>');
break;
case'(':
if(c2==')')
return('=');
else if(c2=='#')
return(ERROR);
else
return('<');
case')':
if(c2=='(')
return(ERROR);
else
return('>');
case'#':
if(c2==')')
return(ERROR);
else if(c2=='#')
return('=');
else
return('<');
default:
exit(0);
}
}
SElemType Operate(int a,char theta,int b)//实现四则运算
{
int result;
a=a-'0';
b=b-'0';
switch(theta)
{
case'+':
result=a+b;
break;
case'-':
result=a-b;
break;
case'*':
result=a*b;
break;
case'/':
result=a/b;
break;
}
result=result+'0';//!注意,这里的result可能也不是相应的数值字符!
return(result);
}
SElemType EvalutaExpression()//实现运算式的求值
{
SqStack OPTR,OPND;
InitStack(OPTR);//符号栈
InitStack(OPND);//数栈
char c[100],x,theta,a,b;
int i=0,s;
c[i]=getchar();
while(c[i]!='#'||GetTop(OPTR)!='#')
{
if(c[i]>='0'&&c[i]<='9')
{
s=c[i]-48;
i++;
c[i]=getchar();
while(c[i]>='0'&&c[i]<='0')
{
s=s*10;
s=s+(c[i]-48);
i++;
c[i]=getchar();
}
s=s+'0';
Push(OPND,s);
s=0;
}
if(In(c[i])){
switch(Precede(GetTop(OPTR),c[i]))
{
case'<':Push(OPTR,c[i]);
i++;
c[i]=getchar();
break;
case'=':Pop(OPTR,x);
i++;
c[i]=getchar();
break;
case'>':theta=GetTop(OPTR);
b=GetTop(OPND);
a=GetTop(OPND);
Push(OPND,Operate(a,theta,b));
break;
}
}
}
return(GetTop(OPND)-'0');
}
int main()//实现输入表达式格式的判断和多位数的表达式计算
{
int i;
printf("请输入您需要计算的表达式,以“#”结束:\n");
i=EvalutaExpression();
printf("The result is %d",i);
printf("\n");
}