Cod sursa(job #1461702)

Utilizator zertixMaradin Octavian zertix Data 16 iulie 2015 12:04:59
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
char s[100000];
int verif(int l,int l1)
{
    int k=0,k1=0;
    for (int i=l;i<=l1; ++i)
    if (s[i]=='(')
        k++;
        else if (s[i]==')')
        k--;
    if (k==0 && s[l1-1]==')' && s[l]=='(')
    return 1;
    if (k>0)
    return 2;
    else if (k<0)
    return 3;
    return 0;
}
int operatie(int l,int l1,char c1,char c2)
{
    int ok=0,ok1=0;
    for (int i=l1;i>=l; --i)
    if (s[i]==')')
    ok++;
    else if (s[i]=='(')
        ok--;
    else if (s[i]==c1 && ok==0 || s[i]==c2 && ok==0)
        return i;
    return -1;
}
int rezolv(int l,int l1)
{
    int x=verif(l,l1);
    while (x)
    {
        if (x==1)
        {
        l++;
        l1--;
        }
        else if (x==2)
        l++;
        else if (x==3)
        l1--;
        x=verif(l,l1);
    }
    int v=operatie(l,l1,'+','-');
    if (v>=0)
        {
            if (s[v]=='+')
                return rezolv(v+1,l1)+rezolv(l,v-1);
                else if (s[v]=='-')
                return rezolv(l,v-1)-rezolv(v+1,l1);
        }
    else
    {
    int v=operatie(l,l1,'/','*');
    if (v>=0)
    {
        if (s[v]=='*')
                return rezolv(v+1,l1)*rezolv(l,v-1);
                else if (s[v]=='/')
                return rezolv(l,v-1)/rezolv(v+1,l1);
    }
    else
    {
        int n=0;
        for (int c=l;c<=l1;c++)
        n=n*10+s[c]-'0';
        return n;
    }
    }

}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    scanf("%s",&s);
    int l=strlen(s);
    printf("%d",rezolv(0,l-1));
    return 0;
}