该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
求解答
#include
#include
#define max 1024
typedef struct
{
float a[max];
int topa;
}OPRD,Oprd;
typedef struct
{
char b[max];
int topb;
}OPTR,Optr;
Oprd*Initpa() //栈的初始化
{
Oprd* pa;
pa=(Oprd*)malloc(sizeof(Oprd));
if(!pa)
{
printf("操作数空间不足\n");
return NULL;
}
else
{
pa->topa=-1;
return pa;
}
}
Optr*Initpb() //栈的初始化
{
Optr* pb;
pb=(Optr*)malloc(sizeof(Optr));
if(!pb)
{
printf("运算符空间不足\n");
return NULL;
}
else
{
pb->topb='#';
return pb;
}
}
int Cmp(char b1,char b2)
{int a1,a2;
int priority[7][7]={{1,1,2,2,2,1,1},{1,1,2,2,2,1,1},{1,1,1,1,2,1,1},{1,1,1,1,2,1,1},{2,2,2,2,2,0,3},{1,1,1,1,3,1,1},{2,2,2,2,2,3,0}};
switch(b1)
{case'+': a1=0;
case'-': a1=1;
case'*': a1=2;
case'/': a1=3;
case'(': a1=4;
case')': a1=5;
case'#': a1=6;
}
switch(b2)
{case'+': a2=0;
case'-': a2=1;
case'*': a2=2;
case'/': a2=3;
case'(': a2=4;
case')': a2=5;
case'#': a2=6;
}
return priority[a1][a2];
}
int Popa()
{
Oprd* pa;
float t;
t=pa->a[pa->topa];
pa->topa--;
return t;
}
float jisuan( float v1,float v2,char v3)
{
float v4;
switch(v3)
{
case'+': v4=v1+v2;
case'-': v4=v1-v2;
case'*': v4=v1*v2;
case'/': v4=v1/v2;
}
return v4;
}
int main()
{
Oprd* pa;
Optr* pb;
Initpa();
Initpb();
int x;
float a,b,c,z;
char y;
printf("请按照以下格式输入x 运算符 y #\n");
do
{
scanf("%f",&pa->a[pa->topa]);
pa->topa++;
scanf("%c",&y);
z=Cmp(pb->b[pb->topb],y);
switch(z)
{
case'2': pb->topb++;
pb->b[pb->topb]=y;
case'1': a=Popa();
b=Popa();
c=jisuan(b,a,y);
pa->topa++;
pa->a[pa->topa]=c;
case'0': pb->topb--;
}
}while(y!='#');
if(y=='#')
{
int m1,m2,m3;
char n;
while(pb->topb!=-1)
{
m1=Popa();
m2=Popa();
n=pb->b[pb->topb];
pb->topb--;
m3=jisuan(m2,m1,n);
pa->topa++;
pa->a[pa->topa]=m3;
}
printf("%f",pa->a[0]);
}
}