Cod sursa(job #3274430)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 6 februarie 2025 19:19:07
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.31 kb
#include <bits/stdc++.h>

using namespace std;

vector <long long> s;

vector <bool> sm;

vector <long long> pr;

char cr[100065];

bool smn=false;

vector <bool> sn;

int main()
{
    ifstream cin("evaluare.in");
    ofstream cout("evaluare.out");
    smn=true;
    cin.getline(cr,100065);
    s.push_back(0);
    int l=strlen(cr);
    if(cr[0]!='-')
    {
        sm.push_back(1);
    }
    int nr=0;
    for(int i=0;i<strlen(cr);++i)
    {
        if(cr[i]=='+')
        {
            sm.push_back(1);
        }
        else if(cr[i]=='-')
        {
            sm.push_back(0);
        }
        else if(cr[i]=='(')
        {
            s.push_back(0);
            if(cr[i+1]!='-')
            {
                sm.push_back(1);
            }
            if(i==0 || strchr("*/",cr[i-1])==0)
            {
                pr.push_back(1);
            }
        }
        else if(cr[i]=='+')
        {
            sm.push_back(1);
            smn=true;
        }
        else if(cr[i]=='-')
        {
            sm.push_back(0);
            smn=true;
        }
        else if(cr[i]=='*')
        {
            smn=true;
            sn.push_back(1);
        }
        else if(cr[i]=='/')
        {
            smn=false;
            sn.push_back(0);
        }
        else if(cr[i]>='0' && cr[i]<='9')
        {
                        if(i==0 || strchr("0123456789",cr[i-1])==0)
            {
                nr=0;
            }
            nr=nr*10+int(cr[i])-48;
            if(i==0 || strchr("*/0123456789",cr[i-1])==0)
            {
                pr.push_back(1);
                sn.push_back(1);
            }
            if(i==l-1 || strchr("0123456789",cr[i+1])==0)
            {
                if(sn[sn.size()-1]==true)
                {
                    //cout<<  pr[pr.size()-1]<<" "<<nr<<"    ";
                    pr[pr.size()-1]*=nr;
                }
                else
                {
                    pr[pr.size()-1]/=nr;
                }
                nr=0;
            }
            if(l-1==i || strchr("0123456789/*",cr[i+1])==0)
            {
                if(sm[sm.size()-1]==1)
                {
                   s[s.size()-1]+=pr[pr.size()-1];
                   pr.pop_back();
                }
                else
                {
                   s[s.size()-1]-=pr[pr.size()-1];
                   pr.pop_back();
                }
            }
        }
        else if(cr[i]==')')
        {
            nr=s[s.size()-1];
            s.pop_back();
            if(i==l-1 || strchr("0123456789",cr[i+1])==0)
            {
                if(sn[sn.size()-1]==true)
                {
                    pr[pr.size()-1]*=nr;
                }
                else
                {
                    pr[pr.size()-1]/=nr;
                }
            }
            if(i==l-1 || strchr("0123456789/*",cr[i+1])==0)
            {
                if(sm[sm.size()-1]==1)
                {
                   s[s.size()-1]+=pr[pr.size()-1];
                   pr.pop_back();
                }
                else
                {
                   s[s.size()-1]-=pr[pr.size()-1];
                   pr.pop_back();
                }
            }
        }
    }
    cout<<s[0];
    return 0;
}