Cod sursa(job #1752962)

Utilizator Burbon13Burbon13 Burbon13 Data 5 septembrie 2016 16:34:04
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

const int nmx = 100002;

int l;
char s[nmx];

void citire()
{
    scanf("%s", s);
    l = strlen(s);
}

void reduceeeereee(int &st, int &dr)
{
    while(s[st] == '(' && s[dr] == ')')
    {
        int nr = 1;
        int pos = st + 1;

        while(pos < dr)
        {
            if(s[pos] == '(')
                ++ nr;
            if(s[pos] == ')')
                -- nr;
            if(nr == 0)
                return;
            ++ pos;
        }

        ++ st;
        -- dr;
    }
}

int eval(int st, int dr)
{
    reduceeeereee(st,dr);

    int nr = 0;

    for(int i = dr; i >= st; --i)
    {
        if(s[i] == ')')
            ++ nr;
        if(s[i] == '(')
            -- nr;
        if(s[i] == '+' && not nr)
            return eval(st,i-1) + eval(i+1,dr);
        else if(s[i] == '-' && not nr)
            return eval(st,i-1) - eval(i+1,dr);
    }

    for(int i = dr; i >= st; --i)
    {
        if(s[i] == ')')
            ++ nr;
        if(s[i] == '(')
            -- nr;
        if(s[i] == '*' && not nr)
            return eval(st,i-1) * eval(i+1,dr);
        else if(s[i] == '/' && not nr)
            return eval(st,i-1) / eval(i+1,dr);
    }

    return atoi(s+st);

}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    citire();
    printf("%d\n", eval(0,l-1));
    return 0;
}