Cod sursa(job #2764410)

Utilizator KarinAAndrei Karina KarinA Data 20 iulie 2021 19:50:18
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
#include <vector>
using namespace std;

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

char s[100005];
int Next[100005],n;
stack <int> st;

int precalc()
{
    n=strlen(s+1);
    for(int i=1; i<=n; i++)
    {
        if(s[i]=='(')
            st.push(i);
        if(s[i]==')')
        {
            Next[st.top()]=i;
            st.pop();
        }
    }
}

/// 1 = '+'
/// -1 = '-'
/// 3 = '*'
/// 4 = '/'

int solve(int st, int dr)
{
    vector <int> v;
    int semn=1,x=0,ans;
    for(int i=st; i<=dr; i++)
    {
        if(s[i]=='(')
        {
            x=solve(i+1,Next[i]-1);
            i=Next[i];
            continue;
        }
        if(isdigit(s[i]))
        {
            x=x*10+(s[i]-'0');
            continue;
        }
        if(semn==3)
        {
            v.back()*=x;
        }
        else if(semn==4)
            v.back()/=x;
        else v.push_back(semn*x);
        if(s[i]=='*')
            semn=3;
        if(s[i]=='/')
            semn=4;
        if(s[i]=='+')
            semn=1;
        if(s[i]=='-')
            semn=-1;
        x=0;
    }
    if(semn==3)
    {
        v.back()*=x;
    }
    else if(semn==4)
        v.back()/=x;
    else v.push_back(semn*x);
    for(int i=0; i<v.size(); i++)
    {
        ans+=v[i];
    }
    return ans;
}

int main()
{
    in>>(s+1);
    precalc();
    out<<solve(1,n);
    return 0;
}