Cod sursa(job #1979304)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 10 mai 2017 10:07:30
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

char s[100005];

void deparantezare(int &st,int &dr)
{

    while(s[st] == '(' && s[dr] == ')')
    {
        int nr = 0;
        for(int i=st+1; i<dr; i++)
            if(s[i] == '(')
                nr++;
            else if(s[i] == ')')
                nr--;
        if(nr==0)
        {
            st++;
            dr--;
        }
    }

}

int rec(int st,int dr)
{
    deparantezare(st,dr);
    int nr = 0;
    for(int i=dr; i>=st; i--)
    {
        if(s[i] == '(')
            nr++;
        else if(s[i] == ')')
            nr--;
        if((s[i] == '+' || s[i] == '-' ) && nr == 0)
        {
            if(s[i] == '+')
                return rec(st,i-1) + rec(i+1,dr);
            else
                return rec(st,i-1) - rec(i+1,dr);
        }
    }

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

    return atoi(s+st);

}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    scanf("%s",s);
    printf("%d",rec(0,strlen(s)-1));


    return 0;
}