Cod sursa(job #2899279)

Utilizator suimerchantsui merchant suimerchant Data 8 mai 2022 13:50:42
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;


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


int n,top;
char v[100005];
int Next[100005];
int stk[100005];


void read()
{
    fin>>v+1;
    n=strlen(v+1);
}


void precalc()
{
    top=0;
    for(int i=1;i<=n;i++)
    {
        if(v[i]=='(')
        {
            stk[++top]=i;
        }
        else if(v[i]==')')
        {
            Next[stk[top]]=i;
            top--;
        }
    }
}


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


int main()
{
    read();
    precalc();
    fout<<solve(1,n);
    return 0;
}