表达式求值(模板)c++

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<int,int> PII;
const int maxn=1e5+10;

ll val(ll x,ll y,char xp){ //自定义运算函数(xp为运算符) 

    if(xp=='*'||xp=='x'||xp=='X')return x*y;
    if(xp=='/')return x/y;
    if(xp=='+')return x+y;
    if(xp=='-')return x-y;
    return 0;
}
ll int_string(string s){   //string转int
    ll su=0;
    int i=0;
    int flag=1;
    if(s[0]=='-'){
        flag=-1;
        i=1;
    }
    for(;i<s.size();i++){
        su=su*10+(s[i]-'0');
    }

    return su*flag;
}
string string_int(ll s){   //int转string
    if(s==0)return "0";
    ll x=s;
    string res;
    s=abs(s);
    while(s){
        res=char((s%10)+'0')+res;
        s/=10;
    }
    if(x<0)return "-"+res;
    return res;

}
vector<string> solution(string s){ //将 "123+234" 化为["123","+","234"] 
    vector<string> num;
    for(int i=0;i<s.size();){
        if(s[i]>='0'&&s[i]<='9'){
            string su="";
            while(i<s.size()&&s[i]>='0'&&s[i]<='9'){

                su+=s[i];
                i++;
            }
            num.push_back(su);
        }else{
            string su="";
            su+=s[i];
            num.push_back(su);
            //cout<<su<<endl;
            i++;
        }
    }
    return num;
} 
vector<string> get_val(vector<string> num,char xp){   //只计算运算符为xp的 算数表达式
    vector<string> st;
    for(int i=0;i<num.size();i++){
        if(num[i][0]==xp&&num[i].size()==1){    
            ll x=val(int_string(st[st.size()-1]),int_string(num[++i]),xp);
            st.pop_back();

            st.push_back(string_int(x));

        }else{
            st.push_back(num[i]);
        }
    }
    //for(int i=0;i<st.size();i++)cout<<st[i]<<" ";cout<<endl;
    return st;
}
string get_nores(vector<string>num,string priority){  //求表达式值,priority 运算符优先级 (无括号) 
    for(int i=0;i<priority.size();i++){
        num=get_val(num,priority[i]);
    }
    return num[0];
}
string get_res(vector<string>num,string priority){ //求表达式值,priority 为运算符优先级 
    int n=num.size();
    vector<string> ans;
    stack<int> st;
    for(int i=0;i<n;i++){
        ans.push_back(num[i]);
        if(num[i][0]=='(')st.push(ans.size()-1);
        else if(num[i][0]==')'){
            int u=st.top();st.pop();
            vector<string> x(ans.begin()+u+1,ans.end()-1);
            string suw = get_nores(x,priority);
            ans.erase(ans.begin()+u,ans.end());
            ans.push_back(suw);
        }
    }
    //for(int i=0;i<ans.size();i++)cout<<ans[i]<<" ";cout<<endl;
    return get_nores(ans,priority);

}
ll ShaGua(string s,string priority){//傻瓜式运算,priority运算符优先级(形如【x == / > + == - 】 即为"x/+-" 
    vector<string>num;
    num = solution(s);
    return int_string(get_res(num,priority));
}
int main(){
    ios::sync_with_stdio(0);
    string s;cin>>s;
    cout<<ShaGua(s,"x/+-")<<endl;
    return 0;
}

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
04-29 12:10
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务