关于严蔚敏数据结构中求表达式的值的程序麻烦看一下哪错了
#include<stdio.h>#include<stdlib.h>
#define initsizement 100
#define increasement 10
typedef struct{
float *base;
float *top;
int sizement;
}sqstack1;
typedef struct{
char *base;
char *top;
int sizement;
}sqstack2;
int init1(sqstack1 &opnd)
{opnd.base=(float*)malloc(initsizement*sizeof(float));
if(!opnd.base)
return 0;
opnd.top=opnd.base;
opnd.sizement=initsizement;
return 1;
}
int push1(sqstack1& opnd,float e)
{if(opnd.top-opnd.base>=opnd.sizement)
{opnd.base=(float*)realloc(opnd.base,(opnd.sizement+increasement)*sizeof(float));
if(!opnd.base)
return 0;
opnd.top=opnd.base+opnd.sizement; //这里有问题
opnd.sizement=opnd.sizement+increasement;}
*opnd.top++=e;
return 1;
}
int pop1(sqstack1& opnd,float& e)
{ if(opnd.base==opnd.top)
return 0;
e=*--opnd.top;
return 1;
}
float gettop1(sqstack1 opnd)
{if(opnd.base==opnd.top)
exit(1);
return (*(opnd.top-1));
}
int init2(sqstack2 &optr)
{optr.base=(char*)malloc(initsizement*sizeof(char));
if(!optr.base)
return 0;
optr.top=optr.base;
optr.sizement=initsizement;
return 1;
}
int push2(sqstack2& optr,char e)
{if(optr.top-optr.base>=optr.sizement)
{optr.base=(char*)realloc(optr.base,(optr.sizement+increasement)*sizeof(char));
if(!optr.base)
return 0;
optr.top=optr.base+optr.sizement; //这里有问题
optr.sizement=optr.sizement+increasement;}
*optr.top++=e;
return 1;
}
int pop2(sqstack2& optr,char& e)
{ if(optr.base==optr.top)
return 0;
e=*--optr.top;
return 1;
}
char gettop2(sqstack2 optr)
{if(optr.base==optr.top)
exit(1);
return *(optr.top-1);
}
int in(char c)
{if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
return 1;
else
return 0;
}
float operate(float a,char theta,float b)
{float c;
switch(theta)
{case '+':
c=a+b;
break;
case '-':
c=a-b;
break;
case '*':
c=a*b;
break;
case '/':
c=a/b;
break;}
return c;
}
char precede(char a,char b)
{int i,j;
char p[8][8]={{' ','+','-','*','/','(',')','#'},{'+','>','>','<','<','<','>','>'},{'-','>','>','<','<','<','>','>'},{'*','>','>','>','>','<','>','>'},
{'/','>','>','>','>','<','>','>'},{'(','<','<','<','<','<','=',' '},{')','>','>','>','>',' ','>','>'},{'#','<','<','<','<','<',' ','='}};
for(i=0;i<8;i++)
{if(p[i][0]==a)
break;}
for(j=0;j<8;j++)
{if(p[0][j]==b)
break;}
return p[i][j];}
float evaluateexpression(sqstack1 opnd,sqstack2 optr)
{ char c,theta,x;
float a,b,i;
push2(optr,'#');
c=getchar();
while(c!='#'||gettop2(optr)!='#')
{
if(!in(c))
{i=float(c-48);
push1(opnd,i);
c=getchar();}
else {
switch(precede(gettop2(optr),c))
{case '>':
pop2(optr,theta);
pop1(opnd,a);
pop1(opnd,b);
push1(opnd,operate(a,theta,b));
break;
case '=':
pop2(optr,x);
c=getchar();
break;
case '<':
push2(optr,c);
c=getchar();
break;}
}
}
return gettop1(opnd);
}
int main()
{float m;
sqstack1 opnd;
sqstack2 optr;
init1(opnd);
init2(optr);
printf("请输入表达式\n");
m=evaluateexpression(opnd,optr);
printf("结果是 %f\n",m);
return 0;
}