Cod sursa(job #792508)

Utilizator Sm3USmeu Rares Sm3U Data 27 septembrie 2012 13:55:19
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <cstdio>
#include <cstring>

using namespace std;

char expresie [100010];

void citire(){
    gets (expresie);
}

int paranteza (int st, int dr){
    int p = 1;
    st ++;
    while (st <= dr && p){
        if (expresie [st] == ')'){
            p --;
        }
        if (expresie [st] == '('){
            p ++;
        }
        st ++;
    }
    if (st <= dr){
        return 0;
    }
    if (p != 0){
        return 0;
    }
    return 1;
}

int eval (int st, int dr){
    // daca am o paranteza mare
    if (expresie[st] == '(' && expresie[dr] == ')' && paranteza (st,dr)){
        return eval (st + 1, dr - 1);
    }

    // verifica daca am + sau -
    for (int i = dr; i >= st; i --){
        if (expresie[i] == '+'){
            return eval (st, i - 1) + eval (i + 1, dr);
        }
        if (expresie[i] == '-'){
            return eval (st, i - 1) - eval (i + 1, dr);
        }
        // sare peste paranteza
        if (expresie[i] == ')'){
            int p = 1;
            while (p){
                i --;
                if (expresie[i] == ')'){
                    p ++;
                }
                if (expresie[i] == '('){
                    p --;
                }
            }
        }
    }

    // verifica daca am * sau /
    for (int i = dr; i >= st; i --){
        if (expresie[i] == '*'){
            return eval (st, i - 1) * eval (i + 1, dr);
        }
        if (expresie[i] == '/'){
            return eval (st, i - 1) / eval (i + 1, dr);
        }
        // sare peste paranteza
        if (expresie[i] == ')'){
            int p = 1;
            while (p){
                i --;
                if (expresie[i] == ')'){
                    p ++;
                }
                if (expresie[i] == '('){
                    p --;
                }
            }
        }
    }
    int x;
    sscanf (expresie + st, "%d", &x);
    return x;
}

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

    citire();
    printf ("%d", eval (0, strlen(expresie) - 1));

    return 0;
}