Cod sursa(job #3182129)

Utilizator Rares0netOnet Rares-Petru Rares0net Data 8 decembrie 2023 17:54:09
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
//Rares 0net
using namespace std;
#ifdef RS
    #include "Rares0.hpp"
#else
    #include<string>
    #include<fstream>
    #include<algorithm>
    const string N_file="evaluare";
    ifstream fin(N_file+".in");
    ofstream fout(N_file+".out");
    #define cin fin
    #define cout fout
#endif
#define endl '\n'
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define f first
#define s second
#define INF 0x3f3f3f3f
void RSinit()
{
    cin.tie(0)->sync_with_stdio(false);
    cout.tie(0);
}
string str;
int SenmFinding(int st, int dr, char s1, char s2)
{
    int ct=0;
    for(int i=dr; i>=st; --i)
    {
        if(str[i]==')')
            ct++;
        if(str[i]=='(')
            ct--;
        if(!ct && (s1==str[i] || s2==str[i]))
            return i;
    }
    return -1;
}
int formNum(int st, int dr)
{
    int ans=0;
    for(int i=st; i<=dr; ++i)
        ans=ans*10+(str[i]-'0');
    return ans;
}
int RecSolve(int st, int dr)
{
    if(st > dr) return 0;
    int pos=SenmFinding(st, dr, '+', '-');
    if(pos!=-1)
    {
        int e1=RecSolve(st, pos-1);
        int e2=RecSolve(pos+1, dr);
        return (str[pos]=='+' ? e1+e2 : e1-e2);
    }
    pos=SenmFinding(st, dr, '*', '/');
    if(pos!=-1)
    {
        int e1=RecSolve(st, pos-1);
        int e2=RecSolve(pos+1, dr);
        return (str[pos]=='*' ? e1*e2 : e1/e2);
    }
    if(str[st]=='(' && str[dr]==')')
        return RecSolve(st+1, dr-1);
    return formNum(st, dr);
}
void Read()
{
    getline(cin, str);
}
void Solve()
{
    cout<<RecSolve(0, (int)str.size()-1);
}
main()
{
    RSinit();
    Read();
    Solve();
}