Cod sursa(job #3327300)

Utilizator Iustin.DDragusanu Iustin Iustin.D Data 3 decembrie 2025 10:31:06
Problema Evaluarea unei expresii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <stack>
#include <vector>
using namespace std;

ifstream cin("evaluare.in");
ofstream cout("evaluare.out");

#define int long long

int val(vector<int>v)
{
    for (int i=0; i<v.size(); i++)
    {
        if (v[i]==-9)
        {
            int cl=1,cr=0;
            vector<int>v2;
            for (int j=i+1; j<v.size(); j++)
            {
                if (v[j]==-9) cl++;
                if (v[j]==-10) cr++;
                //cout<<j<<" "<<cl<<" "<<cr<<"\n";
                if (cl==cr)
                {
                    v.erase(v.begin()+i,v.begin()+j+1);
                    v.insert(v.begin()+i,val(v2));
                    //cout<<val(v2)<<"\n";
                    break;
                }
                else v2.push_back(v[j]);
            }
        }
    }
    for (int i=0; i<v.size(); i++)
    {
        //cout<<v[i]<<" ";
        if (v[i]==-3)
        {
            v[i-1]*=v[i+1];
            v.erase(v.begin()+i,v.begin()+i+2);
        }
        if (v[i]==-4)
        {
            v[i-1]/=v[i+1];
            v.erase(v.begin()+i,v.begin()+i+2);
        }
    }
    int rf=v[0];
    for (int i=1; i<v.size(); i+=2)
    {
        //cout<<v[i]<<" "<<v[i+1];
        if (v[i]==-1) rf+=v[i+1];
        else rf-=v[i+1];
    }
    return rf;
}

int32_t main()
{
    string str;
    cin>>str;
    vector<int>v;
    for (int i=0; i<str.size(); i++)
    {
        if (str[i]>='0'&&str[i]<='9')
        {
            int y=0,r=str.size()-1;
            for (int j=i; j<str.size(); j++)
            {
                if (str[j]<'0'||str[j]>'9') break;
                y=y*10+str[j]-'0';
                r=j;
            }
            i=r;
            v.push_back(y);
        }
        if (str[i]=='+') v.push_back(-1);
        if (str[i]=='-') v.push_back(-2);
        if (str[i]=='*') v.push_back(-3);
        if (str[i]=='/') v.push_back(-4);
        if (str[i]=='(') v.push_back(-9);
        if (str[i]==')') v.push_back(-10);
    }
    cout<<val(v);
}