Cod sursa(job #713693)

Utilizator Sm3USmeu Rares Sm3U Data 14 martie 2012 21:01:09
Problema Evaluarea unei expresii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 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;
    for (int i = deUnde; i >= panaUnde; -- i){
        if (expresie[i] == ')'){
            paranteze ++;
            int incepe = i;
            i --;
            while (paranteze){
                if (expresie [i] == ')')
                    paranteze ++;
                if (expresie [i] == '(')
                    paranteze --;
                i--;
            }
            if (i < panaUnde &&  incepe == deUnde){
                return rez (panaUnde + 1, deUnde - 1);
            }
        }
        if (expresie[i] == '('){
            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);
        }
    }
    for (int i = deUnde; i >= panaUnde ; -- i){
        if (expresie[i] == ')'){
            paranteze ++;
            int incepe = i;
            i --;
            while (paranteze ){
                if (expresie [i] == ')')
                    paranteze ++;
                if (expresie [i] == '(')
                    paranteze --;
                i--;
            }
            if (i < panaUnde && incepe == deUnde){
                return rez (panaUnde + 1, deUnde - 1);
            }
        }
        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;
}