Cod sursa(job #1461687)

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

    if (v>=0)
    {
        if (s[v]=='*')
                return rezolv(s,v+1,l1)*rezolv(s,l,v);
                else if (s[v]=='/')
                return rezolv(s,l,v)/rezolv(s,v+1,l1);

    }
    else
    {
        int n=0;
        for (int c=l;c<l1;c++)
        n=n*10+s[c]-'0';
        return n;
    }
    }

}

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