中缀表达式转换为后缀表达式

目录

1.将中缀表达式转化为后缀表达式函数

2.对后缀表达式求值函数


这个题目比较复杂,分很多种情况,传入返回的值的类型也不一样,代码只能当作思路来看,在编译器上跑不出相应的结果。函数存在内存泄漏,传参混乱等问题。

1.将中缀表达式转化为后缀表达式函数

void Trans(SqStack *Optr,char *exp,char postxp[]){
    ElemType e;
    int i = 0;
    while (*exp != '\0'){
        switch (*exp) {
            case '(':
                Push(Optr,'(');
                exp++;
                break;
            case ')':
                e = Pop(Optr,e);
                while (e != '('){
                    postxp[i++] = e;
                    e = Pop(Optr,e);
                }
                exp++;
                break;
            case '+':
            case '-':
                while (EmptyStack(Optr)){
                    e = GetTop(Optr,e);
                    if(e == '*' || e == '/'){
                        postxp[i++] = e;
                        Pop(Optr,e);
                    }
                    else
                        break;
                }
                Push(Optr,*exp);
                exp++;
                break;
            case '*':
            case '/':
                while (EmptyStack(Optr)){//栈不为空时循环
                    e = GetTop(Optr,e);//取栈顶元素e
                    if(e == '*' || e == '/'){//栈顶'*'或者'/'出栈存放到postxp中
                        postxp[i++] = e;
                        Pop(Optr,e);
                    }
                    else  //e条件不满足直接退出
                        break;
                }
                Push(Optr,*exp);
                exp++;
                break;
            default:
                while (*exp >= '0' && *exp <= '9'){
                    postxp[i++] = *exp;
                    exp++;
                }
                postxp[i++] = '#'; //用#表示一个数字串结束
        }
    }

    while (EmptyStack(Optr)){
        e = Pop(Optr,e);
        postxp[i++] = e;
    }
    postxp[i] = '\0';//给postxp添加结束标识
    DestroyStack(Optr);
}

2.对后缀表达式求值函数

double compvalue(SqStack1 *Opnd,char * postxp){
    ElemType l;
    Opnd -> top = -1;
    double d,a,b,c,e;
    while (*postxp != '\0'){
        switch (*postxp) {
            case '+':
                a = Pop1(Opnd,a);
                b = Pop1(Opnd,b);
                c = b + a;
                Push1(Opnd,c);
                break;
            case '-':
                a = Pop1(Opnd,a);
                b = Pop1(Opnd,b);
                c = b - a;
                Push1(Opnd,c);
                break;
            case '*':
                a = Pop1(Opnd,a);
                b = Pop1(Opnd,b);
                c = b * a;
                Push1(Opnd,c);
                break;
            case '/':
                a = Pop1(Opnd,a);
                b = Pop1(Opnd,b);
                if(a != 0){
                    c = b / a;
                    Push1(Opnd,c);
                    break;
                } else{
                    printf("分母为0,发生错误\n");
                    exit(0);
                }
                break;
        }
        postxp++;
    }
    e = GetTop1(Opnd,e);
    printf("%lf\n",e);
    DestroyStack(Opnd);
    return e;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值