Cod sursa(job #3197341)

Utilizator vladorovOroviceanu Vlad vladorov Data 26 ianuarie 2024 16:17:30
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

vector<string> split(const string& str, char filter){
    vector<string> result;

    unsigned int p1=0, p2=0; int depth=0;
    while(p2<str.size()){
        if(str[p2]=='(') depth++;
        else if(str[p2]==')') depth--;

        if(str[p2]!=filter || depth!=0){
            p2++;
            continue;
        }

        result.push_back(str.substr(p1, p2-p1));
        p1=++p2;
    }
    result.push_back(str.substr(p1, p2-p1));

    return result;
}

int eval_expr(const string& expr){
    vector<string> add_split=split(expr, '+');

    int add_result=0;
    for(auto add_str : add_split){
        vector<string> mult_split=split(add_str, '*');

        int mult_result=1;
        for(auto mult_str : mult_split){

            if(mult_str[0]=='('){
                mult_result*=eval_expr(mult_str.substr(1, mult_str.size()-2));

            }else if(mult_str[1]=='/'){
                if(mult_str.substr(2, mult_str.size()-2)[0]=='('){
                    mult_result/=eval_expr(mult_str.substr(2, mult_str.size()-2));

                }else{
                    mult_result/=stoi(mult_str.substr(2, mult_str.size()-2));
                }

            }else{
                mult_result*=stoi(mult_str);
            }
        }

        add_result+=mult_result;
    }

    return add_result;
}

int main(){
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");

    string expr; fin>>expr;

    for(unsigned int i=0; i<expr.size(); i++){
        if(expr[i]=='-' && expr[i+1]=='('){
            expr.insert(expr.begin()+i, '+');
            expr.insert(expr.begin()+i+2, '*');
            expr.insert(expr.begin()+i+2, '1');
            i+=3;
        }

        if(expr[i]=='-'){
            expr.insert(expr.begin()+i, '+');
            i++;
        }else if(expr[i]=='/'){
            expr.insert(expr.begin()+i, '1');
            expr.insert(expr.begin()+i, '*');
            i+=2;
        }
    }

    fout<<eval_expr(expr);

    return 0;
}