关于数据结构表达式求值的问题
我写了一个程序但是总出现问题,上网查了下都是代码也没什么说明,所以想看下别人的思路,所以看下大家解这个问题的思路是怎么样,谢谢了我的思路是,设置2个栈,一个读入操作数,一个读入运算符,是根据顺序来的(因为第一个肯定是操作数,操作数后面肯定是跟的运算符)。然后当操作数的栈中满了3个数,则判断相应运算符栈中的优先级,比较然后进行运算,比如 1+2*3 *号优先级大于+。将操作数的栈中2换成6,剔除3,然后运算符栈中将*号剔除,如果是1*2+3,则将操作数栈中1换成2,将2换成3,提出3,运算符中也是,但是老是出问题。。。。。下面是代码
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
struct now{
char *base;
char *top;
int stacksize;
}Q;
struct go{
int *base;
int *top;
int stacksize;
}S;
void build_stack(void);
void check(void);
char compare(char a,char b);
int main()
{
check();
return 0;
}
void build_stack(void) //创建空栈
{
S.base=(int*)malloc(sizeof(int)*SIZE);
if(!S.base)
{
printf("分配空间失败!\n");
exit(1);
}
S.top=S.base;
Q.base=(char*)malloc(sizeof(char)*SIZE);
if(!Q.base)
{
printf("分配空间失败!\n");
exit(1);
}
Q.top=Q.base;
}
char compare(char a,char b) //判断优先级
{
char c;
if((a=='-' || a=='+') && (b=='*' || b=='/'))
c='<';
else if((a=='-' || a=='+') && (b=='-' || b=='+'))
c='>';
else if((a=='*' || b=='/') && (b=='-' || a=='+'))
c='>';
else if((a=='*' || a=='/') && (b=='*' || b=='/'))
c='>';
return c;
}
void check(void)
{
char c;
int num,m;
int n=0;
build_stack();
while(c!='\n')
{
if(!(n%2))
{
scanf("%d",&m);
*++S.top=m;
n++;
}
else if((c=getchar())!='\n')
{
*++Q.top=c;
n++;
}
if((S.top-S.base)==3)
{
switch(compare(*(Q.top-1),*Q.top))
{
case '>':
{
if(*(Q.top-1)=='*')
*(S.top-2)=(*(S.top-2))*(*(S.top-1));
else if(*(Q.top-1)=='/')
*(S.top-2)=(*(S.top-2))/(*(S.top-1));
else if(*(Q.top-1)=='-')
*(S.top-2)=(*(S.top-2))-(*(S.top-1));
else if(*(Q.top-1)=='+')
*(S.top-2)=(*(S.top-2))+(*(S.top-1));
*--S.top=*S.top;
*(--Q.top)=*Q.top;
}
case '<':
{
if(*Q.top=='*')
*(--S.top)=(*(S.top-1)) * (*(S.top));
else
*(--S.top)=(*(S.top-1)) / (*(S.top));
}
}
}
if(c=='\n')
break;
}
if(*Q.top=='+')
num=*(S.top-1) + (*S.top);
else if(*Q.top=='-')
num=*(S.top-1) - (*S.top);
else if(*Q.top=='*')
num=*(S.top-1) * (*S.top);
else if(*Q.top=='/')
num=*(S.top-1) / (*S.top);
printf("%d\n",num);
}