【求帮忙找错误】我写的表达式求值的程序 帮帮忙啦
#include <cstdlib>#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define Status int
#define SElemType char
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 12
using namespace std;
typedef struct
{char *base;
char *top;
int stacksize;}SqStackR;
typedef struct
{float *base;
float *top;
int stacksize;}SqStackD;
char InitStackR(SqStackR &S)
{S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//初始化 算符栈
float InitStackD(SqStackD &S)
{S.base=(float*)malloc(STACK_INIT_SIZE*sizeof(float));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
float Operate(float a,char theta,float b)
{ float n;
switch(theta)
{case'+':n=a+b;return n;break;
case'-':n=a-b;return n;break;
case'*':n=a*b;return n;break;
case'/':if(b==0){n==0;break;}
else n=a/b;return n;
break;
default:printf("error\n");
}}
char Precede(char w,char m)
{if((w='+'||'-')&&(m='+'||'-'||')'||'#'))
return ('>');
if((w='+'||'-')&&(m='*'||'/'||'('))
return ('<');
if((w='*'||'/')&&(m='+'||'-'||'*'||'/'||')'||'#'))
return ('>');
if((w='*'||'/')&&(m='('))
return ('<');
if((w='(')&&(m='+'||'-'||'*'||'/'||')'||'#'))
return ('>');
if((w='(')&&(m=')'))
return ('=');
if((w=')')&&(m='+'||'-'||'*'||'/'||')'||'#'))
return ('>');
if((w='#')&&(m='+'||'-'||'*'||'/'||'('))
return ('<');
if((w='#')&&(m='#'))
return ('=');
if((w='(')&&(m='#'))
return ERROR;
if((w=')')&&(m='('))
return ERROR;
if((w='#')&&(m=')'))
return ERROR;
}
float GetTopD1(SqStackD S,float &e)
{if(S.base==S.top) return ERROR;
e=*(S.top-1);
return e;
return OK;
}//GetTop 第一个数据
float GetTopD2(SqStackD S,float &e)
{if(S.base==S.top) return ERROR;
e=*(S.top-2);
return e;
return OK;}//GetTop 第二个数据
char GetTopR(SqStackR S,char &e)
{if(S.base==S.top)return ERROR;
e=*(S.top-1);
return e;
return OK;} //GetTop 算符
float PopD(SqStackD &S,float &e)
{if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;}//删除操作 数据 PopD
char PopR(SqStackR &S,SElemType &e)
{if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;
}//删除操作 算符 PopR
float PushD(SqStackD &S,float e)
{if(S.top-S.base>=S.stacksize)//
{S.base=(float *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)exit (OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;}
*S.top++=e;
return OK;}
char PushR(SqStackR &S,char e)
{if(S.top-S.base>=S.stacksize)//
{S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit (OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;}
*S.top++=e;
return OK;}//插入 算符
int IN(char c,char OP)
{OP='+'||'-'||'*'||'/'||'('||')'||'#';
if (c='+'||'-'||'*'||'/'||'('||')'||'#');
return 1;
}
int main()
/*OperandType EvaluaExpression()*/
{char c;
char OP;
float n;
float z;
int i;
char theta;
char s[100],j;
float a,b;
OP='+'||'-'||'*'||'/'||'('||')'||'#';
SqStackR OPTR;
SqStackD OPND;
InitStackR(OPTR);
PushR (OPTR,('#'));
InitStackD(OPND);
printf("请输入表达式:\n");
gets(s);
for (j=0;j<100;j++)
{c=s[j];
while (c!='#'||GetTopR(OPTR,c)!='#'){
if(!IN(c,OP)){PushD(OPND,c);c=getchar();a=GetTopD1(OPND,a);
b=GetTopD2(OPND,b);}
else
switch (Precede(GetTopR(OPTR,c),c))//为什么都是c
{case'>':
n=Operate(a,theta,b);
PopR(OPTR,theta);
PopD(OPND,a);PopD(OPND,b);
PushD(OPND,n);
z=GetTopD1(OPND,z);
printf("%f",z);
break;
case'<':
PushR(OPTR,c);c=getchar();
z=GetTopD1(OPND,z);
printf("%f",z);
break;
case'=':
PopR(OPTR,c);c=getchar();//我也写c了
z=GetTopD1(OPND,z);
printf("%f",z);
break;}}system("pause");}}