Cod sursa(job #2204666)

Utilizator gaborvlad13Gabor Vlad-Sebastian gaborvlad13 Data 16 mai 2018 19:43:39
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <cstdio>
#include <cstring>


using namespace std;

char tmp[100005];
int paranteze[100005];

void parantezare()
{
    int local[100005], l = 0;
    for (int i=0; i<strlen(tmp); i++)
    {
        if (tmp[i] == '(')
            local[l++] = i;
        else if (tmp[i] == ')')
        {
            paranteze[i] = local[l-1];
            paranteze[local[l-1]] = i;
            l--;
        }
    }
}

int eval(int st = 0, int dr = strlen(tmp)-1)
{
    if (tmp[st] == '(' && paranteze[st] == dr)
            return eval(st+1, dr-1);

    for (int i=dr; i>=st; i--)
    {
        if (tmp[i] == ')')
            i = paranteze[i];
        else if (tmp[i] == '+')
            return eval(st, i-1) + eval(i+1, dr);
        else if (tmp[i] == '-')
            return eval(st, i-1) - eval(i+1, dr);
    }

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

    char numar[10];
    strncpy(numar, tmp+st, dr-st+1);
    numar[dr-st+1] = '\0';
    return atoi(numar);
}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    gets(tmp);
    parantezare();
    printf("%d", eval());
    return 0;
}