波兰式/中序表达式/逆波兰式生成表达式树并求值

波兰式/中序表达式/逆波兰式生成表达式树并求值

part of infix notation

int num(char c){
    int n;
    switch (c)
    {
    case '+':
        n=0;
        break;
    case '-':
        n=1;
        break;
    case '*':
        n=2;
        break;
    case '/':
        n=3;
        break;
    case '(':
        n=4;
        break;
    case ')':
        n=5;
        break;
    case '#':
        n=6;
        break;
    default:
        n=7;
        break;
    }
    return n;
}

int OperPreRe(char top,char ch){
    int ntop,nch;
    int Oper[7][7]={
        1,1,0,0,0,1,1,
        1,1,0,0,0,1,1,
        1,1,1,1,0,1,1,
        1,1,1,1,0,1,1,
        0,0,0,0,0,2,3,
        1,1,1,1,3,1,1,
        0,0,0,0,0,3,2
    };
    ntop=num(top);
    nch=num(ch);
    if(nch==7||ntop==7){
        return 4;
    }
    else{
        return Oper[ntop][nch];
    }
}

void InExpress(BinThrTree &T){
    stack<BinThrTree> OPTR,EXPT;
    char ch;
    BinThrTree par;
    int n;
    cin>>ch;
    par=new BinThrNode;
    par->data=ch,par->lchild=par->rchild=NULL;
    OPTR.push(par);
    cin>>ch;
    while(1){
        if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'){
            switch (OperPreRe(OPTR.top()->data,ch))
            {
            case 0:     //less
                par=new BinThrNode;
                par->data=ch,par->lchild=par->rchild=NULL;
                OPTR.push(par);
                cin>>ch;
                break;
            case 1:     //greater

                OPTR.top()->rchild=EXPT.top();
                EXPT.pop();
                OPTR.top()->lchild=EXPT.top();
                EXPT.pop();
                EXPT.push(OPTR.top());
                OPTR.pop();
                T=EXPT.top();
                if(ch!='#'&&ch!=')'){
                    par=new BinThrNode;
                    par->data=ch;
                    par->lchild=par->rchild=NULL;
                    OPTR.push(par);
                    cin>>ch; 
                }
                break;
            case 2:     //equal
                OPTR.pop();
                if(ch=='#'){
                    cout<<"complete\n";
                    return;
                }
                cin>>ch;
                break;
            default: 
                cout<<"error\n";
                return;
            }
        }
        else{
            par=new BinThrNode;
            par->data=ch,par->lchild=par->rchild=NULL;
            EXPT.push(par);
            cin>>ch;
        }
    }
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值