Cod sursa(job #1963207)

Utilizator gabor.vlad13lil pump gabor.vlad13 Data 12 aprilie 2017 13:01:52
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#define NMAX 100005

using namespace std;

char tmp[NMAX];
int para[NMAX];

void parantezare()
{
    int loc[NMAX];
    int l = 0;
    for (int i=0; i<strlen(tmp); i++)
    {
        if (tmp[i] == '(')
            loc[l++] = i;
        else if (tmp[i] == ')')
        {
            para[i] = loc[l-1];
            para[loc[l-1]] = i;
            l--;
        }
    }
}

int evaluare(int st = 0, int dr = strlen(tmp)-1)
{
    if(tmp[st] == '(' && para[st] == dr)
        return evaluare(st+1, dr-1);
    for (int i=dr; i>=st; i--)
    {
        if (tmp[i] == ')')
            i = para[i];
        if (tmp[i] == '+')
            return evaluare(st, i-1) + evaluare(i+1, dr);
        else if (tmp[i] == '-')
            return evaluare(st, i-1) - evaluare(i+1, dr);
    }

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

    int nr;
    sscanf(tmp + st, "%d", &nr);
    return nr;

}

int main()
{
    freopen("evaluare.in", "r", stdin);
    freopen("evaluare.out", "w", stdout);
    gets(tmp);
    parantezare();
    cout<<evaluare();
    return 0;
}