试采用逻辑算式的后缀(逆波兰)表示法来实现对下列算式的计算并输出计算结果:

1个回答

  • 改进版:

    #include

    #include

    #include

    #include

    #define ERROR 0

    #define OVERFLOW -2

    #define OK 1

    typedef int status;

    typedef char SElemType;

    //////////////////////////////////////////////////////////////////////////////////////////////

    /////////////////////////////////////////////////////////////////////////////////////////////

    #define STACK_INIT_SIZE 100

    #define STACKINCRMENT 10

    typedef struct{

    SElemType *base;

    SElemType *top;

    int stacksize;

    }SqStack;

    status initstack(SqStack *S)

    {//构造一个空栈.

    (*S).base=(SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType));

    if(!(*S).base)return(ERROR);

    (*S).top=(*S).base;

    (*S).stacksize=STACK_INIT_SIZE;

    return(OK);

    }

    status push(SqStack *S,SElemType e)

    {// 操作数和运算符依此进栈.

    if((*S).top - (*S).base >=(*S).stacksize)

    {

    (*S).base =(SElemType * )realloc((*S).base,((*S).stacksize + STACKINCRMENT) *

    sizeof(SElemType));

    if(!(*S).base )exit(OVERFLOW);

    (*S).top =(*S).base + (*S) .stacksize ;

    (*S).stacksize +=STACKINCRMENT;

    }

    *(*S).top++=e;

    return(e);

    }

    status pop(SqStack *S,SElemType *e)

    {//出栈.

    if((*S).top == (*S).base )return(ERROR);

    *e=*--(*S).top ;

    return (e);

    }

    SElemType GetTop(SqStack S)

    {//取栈顶元素.

    SElemType e;

    if(S.base == S.top )return(OVERFLOW);

    e=*(S.top-1);

    return(e);

    }

    ////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////

    char Precede(char c1, char c2)

    {

    //符号优先级别的判断

    switch(c1)

    {

    case '+':

    case '-':

    if(c2 == '*' || c2 == '/' || c2 == '(') return('');

    break;

    case'*':

    case'/':

    if(c2 == '(') return(''); break;

    case'(':

    if(c2 == ')')return('=');

    else return('');break;

    case'#':

    if(c2 == '#')return('=');

    else return('':

    {

    pop(&OPTR, &theta);

    pop(&OPND, &b);

    pop(&OPND, &a);

    push(&OPND,Operate(a,theta,b));

    break;

    }

    }

    }

    return GetTop(OPND);

    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////

    void main()

    {

    int i;

    printf("'#'为结束符!");

    printf("please input a suanshi:");

    i=EvaluateExpression()-'0';

    printf("the result is%dn",i);

    }