首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-10-15 
急!!!!后天交!!!栈的后缀式求值,请大家帮忙!!!都是同一个错误,不知道怎么改了。错误出现在int EvaluateExpr

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

都是同一个错误,不知道怎么改了。错误出现在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);

热点排行