表达式求值


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<stack>
#include<string>
using namespace std;


template<typename T>
class expCal{
    public:
    expCal(){ expMid.clear();expSuffix.clear();}
    expCal(string s){
        expCal();
        init(s);
    }
    int fun(char ch){ //运算符标号
        switch(ch){
            case '+': return 0;
            case '-': return 1;
            case '*': return 2;
            case '/': return 3;
            case '(': return 4;
            case ')': return 5;
        }
        return -1;
    }
    void init(string s){ //初始化,解析字符串成中缀表达式;
        node t;
        int i=0;
        while(i<s.size()){
            while(i<s.size()&&s[i]==' ') i++;
            while(i<s.size()&&s[i]!=' '&&(s[i]<'0'||s[i]>'9')){
                t.isch=fun(s[i]);i++;
                expMid.push_back(t);
            }
            while(i<s.size()&&s[i]==' ') i++;
            if(i<s.size()&&s[i]<='9'&&s[i]>='0'){
                t.val=0;t.isch=-1;
                while(i<s.size()&&s[i]<='9'&&s[i]>='0') t.val=t.val*10+s[i++]-'0';
                expMid.push_back(t);
            }
            while(i<s.size()&&s[i]==' ') i++;
            while(i<s.size()&&s[i]!=' '&&(s[i]<'0'||s[i]>'9')){
                t.isch=fun(s[i]);i++;
                expMid.push_back(t);
            }
        }
    }
    bool midTosuffix(){ //中缀转后缀;
        stack <node> Sta;
        for(int i=0;i<expMid.size();i++){
            if(expMid[i].isch<0) expSuffix.push_back(expMid[i]);
            else {
                if(expMid[i].isch==5){
                    while(Sta.size()&&Sta.top().isch!=4)
                        expSuffix.push_back(Sta.top()),Sta.pop();
                    if(Sta.size()&&Sta.top().isch==4) Sta.pop();
                    else return false;
                    continue;
                }
                while(Sta.size()&&Sta.top().isch!=4&&expMid[i].isch<=Sta.top().isch)
                    expSuffix.push_back(Sta.top()),Sta.pop();
                Sta.push(expMid[i]);
            }
        }
        while(Sta.size()) expSuffix.push_back(Sta.top()),Sta.pop();
        int a=0,b=0;
        for(int i=0;i<expSuffix.size();i++){
            if(expSuffix[i].isch>=0) a++;
            else b++;
        }
        return a+1==b;
    }
    bool subcal(T &ret,T val,int op){ //运算符计算
        if(op==3&&val==0) return false;
        switch(op){
            case 0: ret+=val; break;
            case 1: ret-=val; break;
            case 2: ret*=val; break;
            case 3: ret/=val; break;
        }
        return true;
    }
    bool cal(T &ans){ //计算后缀表达式
        if(midTosuffix()==false) return false;
        stack <node> Sta;
        for(int i=0;i<expSuffix.size();i++){
            if(expSuffix[i].isch<0) Sta.push(expSuffix[i]);
            else {
                if(Sta.size()<2) return false;
                T _val=Sta.top().val;Sta.pop();
                if(subcal(Sta.top().val,_val,expSuffix[i].isch)==false)
                        return false;
            }
        }
        if(Sta.size()!=1) return false;
        ans=Sta.top().val; return true;
    }
public:
    struct node{
        T val;
        int isch;
    };
private:
    vector<node> expMid,expSuffix;
};


char s[11000];
int main(){
    while(gets(s)){
        expCal<double> T(s);
        double ans;
        if(T.cal(ans))
            printf("%f\n",ans);
        else
            printf("error\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值