Cod sursa(job #713671)

Utilizator Sm3USmeu Rares Sm3U Data 14 martie 2012 20:42:02
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <cstdio>
#include <stack>
#include <cstring>
#define nMax 100010

using namespace std;

stack <int> a;
char expresie[nMax];
int n;

int rez(int panaUnde, int deUnde)
{
    int paranteze = 0;
    int aux;
    if (expresie[deUnde] == ')'){
        paranteze ++;
        deUnde --;
    }
    aux = paranteze;
    for (int i = deUnde; i >= panaUnde && paranteze >= aux; -- i){
        if (expresie[i] == ')'){
            paranteze ++;
            while (paranteze != aux){
                if (expresie [i] == ')')
                    paranteze ++;
                if (expresie [i] == '(')
                    paranteze --;
                i--;
            }
            continue;
        }
        if (expresie[i] == '('){
            paranteze --;
            continue;
        }
        if (expresie[i] == '+'){
            return rez (panaUnde, i - 1) + rez (i + 1, deUnde);
        }
        if (expresie[i] == '-'){
            return rez (panaUnde, i - 1) - rez (i + 1, deUnde);
        }
    }
    paranteze = aux;
    for (int i = deUnde; i >= panaUnde && paranteze >= aux; -- i){
        if (expresie[i] == ')'){
            paranteze ++;
            while (paranteze != aux){
                if (expresie [i] == ')')
                    paranteze ++;
                if (expresie [i] == '(')
                    paranteze --;
                i--;
            }
            continue;
        }
        if (expresie[i] == '('){
            paranteze --;
            continue;
        }
        if (expresie[i] == '*'){
            return rez (panaUnde, i - 1) * rez (i + 1, deUnde);
        }
        if (expresie[i] == '/'){
            return rez (panaUnde, i - 1) / rez (i + 1, deUnde);
        }
    }
    int s = 0;
    int zece = 1;
    for (int i = deUnde; i >= panaUnde; -- i){
        if (expresie[i] >= '0' && expresie[i] <= '9'){
            s += (expresie[i] - '0') * zece;
            zece *= 10;
        }
    }
    return s;

}

int main()
{
    freopen ("evaluare.in", "r", stdin);
    freopen ("evaluare.out", "w", stdout);
    gets (expresie);
    n = strlen (expresie);
    printf ("%d\n", rez(0, n - 1));

    return 0;
}