Cod sursa(job #793231)

Utilizator Viva12Ferentz Sergiu Viva12 Data 2 octombrie 2012 12:57:03
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <cstring>
#define N 100050

using namespace std;

char s[N];
int sum = 0;
void citire()
{

    scanf("%s",s);
}


int term(int st,int dr)
{
    int x = 0 ;
    for (int i=st; i <=dr;i++)
    {
        x = x*10 + s[i]-'0';
    }

    return x;
}


int verif(int st,int dr)
{
    int nrpant = 0;
    for(int i = st; i <= dr;i++)
    {

        if(s[i] == '(')
        nrpant++;
        else
        if(s[i] ==')')
        nrpant--;

        if(nrpant == 0 && i < dr)
        return 0;
    }


    if(nrpant == 0)
    return 1;
    return 0;
}


//(296+(286+891+(82+179+358-(48)*(0/173))-(251)))
int evalExp(int st,int dr)
{

    int nrparant =0;
    if (s[st] =='(' && s[dr] == ')')
        if(verif(st,dr) == 1)
        return evalExp(st+1,dr-1);

    for (int i = dr; i >= st;i--)
    {

        if (s[i] == '(')
            nrparant++;
        else
            if (s[i] ==')')
                nrparant--;
            else
                if (s[i] == '+' && nrparant == 0)
                    return evalExp(st,i-1) + evalExp(i+1,dr);
                else
                    if (s[i] == '-' && nrparant == 0)
                        return evalExp(st,i-1) - evalExp(i+1,dr);

    }

    for (int i = dr; i >=st;i--)
    {
        if (s[i] == '(')
            nrparant++;
        else
            if (s[i] ==')')
                nrparant--;
            else
                if (s[i] == '*' && nrparant == 0)
                    return evalExp(st,i-1) * evalExp(i+1,dr);
                else
                    if (s[i] == '/' && nrparant == 0)
                        return evalExp(st,i-1) / evalExp(i+1,dr);

    }
    return term(st,dr);

}


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

    printf("%d",evalExp(0,strlen(s)-1));
    return 0;
}