读书人

急后天交!栈的后缀式求值请大伙儿帮

发布时间: 2013-10-15 16:47:37 作者: rapoo

急!!!!后天交!!!栈的后缀式求值,请大家帮忙!!!
急后天交!栈的后缀式求值,请大伙儿帮忙!

都是同一个错误,不知道怎么改了。错误出现在int EvaluateExpression()这个函数,请帮忙改改,在我的程序的基础上改,不然我看不懂,没法交。谢谢谢谢谢谢!!!


#include <stdio.h>
#include <malloc.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef struct
{
char *base;
char *top;
int stacksize;
}OPTR;//运算符栈

typedef struct
{
int *base;
int *top;
int stacksize;
}OPND;//运算数栈

int InitStack(OPTR &S)//运算符
{
S.base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
if(!S.base) return 0;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return 1;
}

int InitStack(OPND &S)//运算数
{
S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) return 0;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return 1;
}

int StackEmpty(OPTR &S)
{
if(S.base == S.top) return 1;
else return 0;
}

int StackEmpty(OPND &S)
{
if(S.base == S.top) return 1;
else return 0;
}

int Push1(OPTR &S,char e)
{
if(S.top - S.base >= S.stacksize)
{
S.base = (char *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(char));
if(!S.base) return 0;
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return 1;
}

int Push2(OPND &S,int e)
{
if(S.top - S.base >= S.stacksize)
{
S.base = (int *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(int));
if(!S.base) return 0;
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return 1;
}

int Pop1(OPTR &S,char &e)
{
if(S.top == S.base) return 0;
e = *--S.top;
return e;
}

int Pop2(OPND &S,int &e)
{
if(S.top == S.base) return 0;
e = *--S.top;
return e;
}

char GetTop1(OPTR &S)
{
char e;
e = *(S.top - 1);
return e;
}

int GetTop2(OPND &S)
{
int e;
e = *(S.top - 1);
return e;
}

char Precede(char ch1,char ch2)
{
if(ch1 == '+' || ch1 == '-')
{
if(ch2 == '+' || ch2 == '-' || ch2 ==')' || ch2 == '#') return ('>');
else if(ch2 == '*' || ch2 == '/' || ch2 =='(') return ('<');
}
else if(ch1 == '*' || ch1 == '/')
{
if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 ==')' || ch2 == '#') return ('>');
else if(ch2 =='(') return ('<');
}
else if(ch1 =='(')
{
if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 =='(') return ('<');
else if(ch2 ==')') return ('=');
}
else if(ch1 ==')')


{
if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 ==')' || ch2 == '#') return ('>');
}
else if(ch1 =='#')
{
if(ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 =='(') return ('<');
else if(ch2 =='#') return ('=');
}
else if(!((ch1 == '+' || ch1 == '-' || ch1 == '*' || ch1 == '/' || ch1 == '(' || ch1 ==')' || ch1 == '#') && (ch2 == '+' || ch2 == '-' || ch2 == '*' || ch2 == '/' || ch2 == '(' || ch2 ==')' || ch2 == '#'))) return 0;
return 0;
}

char In(char c)
{
if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c ==')' || c == '#') return 1;
else return 0;
}

int Operate(int a, char theta, int b)
{
if(theta == '+') return (a + b);
else if(theta == '-') return (a - b);
else if(theta == '*') return (a * b);
else if(theta == '/') return (a / b);
else return 0;
}

int EvaluateExpression()
{

int a, b,c,x;
char theta;
InitStack(OPTR);
InitStack(OPND);
Push1(OPTR,'#');
c = getchar();
while(c != '#' || GetTop1(OPTR) != '#')
{
if(!In(c)){Push2(OPND,c); c = getchar();}
else
switch(Precede(GetTop1(OPTR),c))
{
case '<':
Push1(OPTR,c); c = getchar();
break;
case '=':
Pop1(OPTR,x); c = getchar();
break;
case '>':
Pop1(OPTR,theta);
Pop2(OPND,b);
Pop2(OPND,a);
Push2(OPND,Operate(a,theta,b));
break;
}
}
return GetTop2(OPND);
return 0;
}

int main()
{

return 0;
} 栈 c
[解决办法]


InitStack(OPTR); ///你传了一个类型,没有传参数
InitStack(OPND);

改为

typedef struct
{
char *base;
char *top;
int stacksize;
}OPTR;//运算符栈

typedef struct
{
int *base;
int *top;
int stacksize;
}OPND;//运算数栈
OPTR optr;
OPND opnd;
...
...
InitStack(optr); ///你传了一个类型,没有传参数
InitStack(opnd);

读书人网 >C语言

热点推荐