Cod sursa(job #909541)

Utilizator Sm3USmeu Rares Sm3U Data 10 martie 2013 16:03:01
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>
#include <cstring>

#define nMax 100010

using namespace std;

char c[nMax];
int n;

void citire(){
    gets(c);
    n = strlen(c);
}

int parantezaMare(int st, int dr){
    int p = 1;
    int i = st + 1;
    for(; p; ++ i){
        if(c[i] == '('){
            p ++;
        }
        if(c[i] == ')'){
            p--;
        }
    }
    return !p && i >= dr;
}

void sari(int &i){
    int p = 1;
    i --;
    while(p){
        if(c[i] == '('){
            p --;
        }
        if(c[i] == ')'){
            p ++;
        }
        i --;
    }
    i ++;
}

int eval(int st, int dr){
    if(c[st] == '(' && c[dr - 1] == ')'){
        if(parantezaMare(st,dr)){
            return eval(st + 1, dr - 1);
        }
    }
    for(int i = dr - 1; i >= st; -- i){
        if(c[i] == ')'){
            sari(i);
            continue;
        }
        if(c[i] == '+'){
            return eval(st, i) + eval(i + 1, dr);
        }
        if(c[i] == '-'){
            return eval(st, i) - eval(i + 1, dr);
        }
    }

    for(int i = dr - 1; i >= st; -- i){
        if(c[i] == ')'){
            sari(i);
            continue;
        }
        if(c[i] == '*'){
            return eval(st, i) * eval(i + 1, dr);
        }
        if(c[i] == '/'){
            return eval(st, i) / eval(i + 1, dr);
        }
    }
    int x = 0;
    for(int i = st; i < dr; ++ i){
        x = x * 10 + (c[i] - '0');
    }
    return x;
}

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

    citire();
    printf("%d\n", eval(0, n));


    return 0;
}