Cod sursa(job #2147180)

Utilizator calin1Serban Calin calin1 Data 28 februarie 2018 15:52:48
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100005

using namespace std;

char s[N], lungime;

int paranteze(int st, int dr)
{
    int nr = 0;

    for(int i = 0 ; i < lungime ; ++i)
    {
        if(s[i] == '(')
        {
            nr++;
        }
        if(s[i] == ')')
        {
            nr--;
        }
    }

    if(!nr)
    {
        return true;
    }
    return false;
}

int semn_plus_minus(int st, int dr)
{
    int nr = 0;

    for(int i = dr ; i >= st ; --i)
    {
        if(s[i] == '(')
        {
            nr++;
        }
        if(s[i] == ')')
        {
            nr--;
        }

        if((s[i] == '+' || s[i] == '-') && nr == 0)
        {
            return i;
        }
    }

    return -1;
}

int semn_steluta_slash(int st, int dr)
{
    int nr = 0;

    for(int i = dr ; i >= st ; --i)
    {
        if(s[i] == '(')
        {
            nr++;
        }
        if(s[i] == ')')
        {
            nr--;
        }

        if((s[i] == '*' || s[i] == '/') && nr == 0)
        {
            return i;
        }
    }

    return -1;
}


int back_(int st, int dr)
{
    if(s[st] == '(' && s[dr] == ')' && paranteze(st + 1, dr - 1))
    {
        return back_(st + 1, dr - 1);
    }

    int poz = semn_plus_minus(st, dr);

    if(poz >= 0)
    {
        switch(s[poz])
        {
            case '+': return back_(st, poz - 1) + back_(poz + 1, dr);
            case '-': return back_(st, poz - 1) - back_(poz + 1, dr);
        }
    }

    poz = semn_steluta_slash(st, dr);

    if(poz >= 0)
    {
        switch(s[poz])
        {
            case '*': return back_(st, poz - 1) * back_(poz + 1, dr);
            case '/': return back_(st, poz - 1) / back_(poz + 1, dr);
        }
    }

    int x = 0;

    for(int i = st ; i <= dr ; ++i)
    {
        x = x * 10 + (s[i] - '0');
    }

    return x;

}

void citire()
{
    fgets(s, N, stdin);

    lungime = strlen(s);

    if(s[lungime - 1] == '\n')
    {
        s[lungime - 1] = 0;

        lungime--;
    }

    printf("%d", back_(0, lungime - 1));
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);

    citire();

    return 0;
}