Cod sursa(job #2912494)

Utilizator GligarEsterabadeyan Hadi Gligar Data 8 iulie 2022 17:40:21
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.15 kb
#include <fstream>
#include <string>
#include <vector>
#include <stack>

class asn{
public:
    virtual int execute(){
        return 0;
    };
};

class asn_sum : public asn{
public:
    asn *lho, *rho;
    int execute(){
        return lho->execute()+rho->execute();
    }
};

class asn_dif : public asn{
public:
    asn *lho, *rho;
    int execute(){
        return lho->execute()-rho->execute();
    }
};

class asn_prod : public asn{
public:
    asn *lho, *rho;
    int execute(){
        return lho->execute()*rho->execute();
    }
};

class asn_div : public asn{
public:
    asn *lho, *rho;
    int execute(){
        return lho->execute()/rho->execute();
    }
};

class asn_num : public asn{
public:
    int x;
    int execute(){
        return x;
    }
};

std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");

std::string s;

std::vector <std::string> t;

std::vector <int> p;

std::stack <int> st;

asn *ast(int l, int r){
    if(r<l){
        asn_num *sol=new asn_num;
        sol->x=0;
        return sol;
    }else if(r==l){
        asn_num *sol=new asn_num;
        int aux=0;
        for(int i=0;i<int(t[l].size());i++){
            aux=aux*10+t[l][i]-'0';
        }
        sol->x=aux;
        return sol;
    }else{
        int i=r;
        while(i>=l&&t[i][0]!='+'&&t[i][0]!='-'){
            if(t[i][0]==')'){
                i=p[i];
            }
            i--;
        }
        if(i>=l){
            if(t[i][0]=='+'){
                asn_sum *sol=new asn_sum;
                sol->lho=ast(l,i-1);
                sol->rho=ast(i+1,r);
                return sol;
            }else{
                asn_dif *sol=new asn_dif;
                sol->lho=ast(l,i-1);
                sol->rho=ast(i+1,r);
                return sol;
            }
        }
        i=r;
        while(i>=l&&t[i][0]!='*'&&t[i][0]!='/'){
            if(t[i][0]==')'){
                i=p[i];
            }
            i--;
        }
        if(i>=l){
            if(t[i][0]=='*'){
                asn_prod *sol=new asn_prod;
                sol->lho=ast(l,i-1);
                sol->rho=ast(i+1,r);
                return sol;
            }else{
                asn_div *sol=new asn_div;
                sol->lho=ast(l,i-1);
                sol->rho=ast(i+1,r);
                return sol;
            }
        }
        return ast(l+1,r-1);
    }
}

int main(){
    fin>>s;
    int n=int(s.size());
    for(int i=0;i<n;i++){
        if(s[i]>='0'&&s[i]<='9'){
            std::string aux;
            while(i<n&&s[i]>='0'&&s[i]<='9'){
                aux+=s[i];
                i++;
            }
            i--;
            t.push_back(aux);
        }else{
            std::string aux;
            aux+=s[i];
            t.push_back(aux);
        }
    }
    n=t.size();
    p.resize(n);
    for(int i=0;i<n;i++){
        if(t[i][0]=='('){
            st.push(i);
        }else if(t[i][0]==')'){
            p[i]=st.top();
            p[st.top()]=i;
            st.pop();
        }
    }
    asn *r=ast(0,n-1);
    fout<<r->execute();
    return 0;
}