用栈来求解表达式,我不知道我的代码哪里错了,麻烦指导下
#define STACK_INIT_SIZE 100#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define SElemType int
#include<stdio.h>
#include<malloc.h>
typedef int Status;
struct SqStack_D{
SElemType *base;
SElemType *top;
int stacksize;
};
struct SqStack_R
{
char *base;
char *top;
int stacksize;
};
Status InitStack_R(SqStack_R &S) //构造空栈(运算符)
{
S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base)
return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status InitStack_D(SqStack_D &S) //构造空栈(操作数)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
return ERROR;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int GetTop_D(SqStack_D S) //若栈不空,用E返回S的栈顶元素,否则返回ERROR
{ int e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
char GetTop_R(SqStack_R S) //若栈不空,用E返回S的栈顶元素,否则返回ERROR
{ char e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
Status Push_D(SqStack_D &S,SElemType e ) //插入元素e为新的栈顶元素
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
int Push_R(SqStack_R &S,char e ) //插入元素e为新的栈顶元素
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)
return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
int Pop_D(SqStack_D &S,SElemType &e) //若栈不空,则删除S的栈顶元素,用e返回其值,把那个返回OK;否则返回ERROR
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
int Pop_R(SqStack_R &S,char e)
{
if(S.base==S.top)
return ERROR;
e=*--S.top;
return OK;
}
int In(char c) //判断输入是否是运算符
{
if(c>='0'&&c<='9')
return OK;
else
return ERROR;
}
char precede(char c,char e) //判断运算符的优先级高低
{
if((c=='+')||(c=='-'))
{
if((e=='*')||(e=='/')||(e=='('))
return '<';
else
return '>';
}
if((c=='*')||(c=='/'))
{
if(e=='(')
return '<';
else
return '>';
}
if(c=='(')
{
if(e==')')
return '=';
else
return '<';
}
if(c==')')
return '>';
if(c=='=')
{
if(e=='=')
return '=';
else
return '<';
}
}
char Precede(char theta1,char theta2)
{
int a,b;
switch(theta1)
{
case'+':a=2;break;
case'-':a=2;break;
case'*':a=4;break;
case'/':a=4;break;
case'(':a=0;break;
case')':a=6;break;
case'=':a=-2;break;
}
switch(theta2)
{
case'+':b=1;break;
case'-':b=1;break;
case'*':b=3;break;
case'/':b=3;break;
case'(':b=6;break;
case')':b=0;break;
case'=':b=-2;break;
}
if(a>b)
return '>';
else if(a==b)
return '=';
else return '<';
}
int Operate(int a,char theta,int b)
{
int s;
switch(theta)
{
case'+':s=a+b;break;
case'-':s=a-b;break;
case'*':s=a*b;break;
case'/':if(b!=0) s=a/b;
else printf("Error input");
break;
}
return s;
}
int main()
{ SqStack_D OPND;
SqStack_R OPTR;
int a,b;
int n,k=0;
char c,theta;
InitStack_R(OPTR);
Push_R(OPTR,'=');
InitStack_D(OPND);
c=getchar();
while((c!='=')||(GetTop_R(OPTR))!='=')
{
if(!In(c))
{ k=0;
switch(Precede(GetTop_R(OPTR),c)){
case'<':Push_R(OPTR,c); //栈顶元素优先级低
c=getchar();
break;
case'=':Pop_R(OPTR,c); //脱括号并接收下一个元素
c=getchar();
break;
case'>':Pop_R(OPTR,theta); //退栈并把运算结果进栈
Pop_D(OPND,b);
Pop_D(OPND,a);
Push_D(OPND,Operate(a,theta,b));
break;
}}
else
{
//转换成int类型
if(k==0)
{ n=c-'0';
Push_D(OPND,n);
c=getchar();
k=1;
}
if(k==1)
{
Pop_D(OPND,n);
n=n*10+c-'0';
Push_D(OPND,n);
c=getchar();
k=1;
}
}
printf("%d",GetTop_D(OPND));
return 0;
}
}