Cod sursa(job #2353880)

Utilizator ana_maria_zotaZota Ana Maria ana_maria_zota Data 24 februarie 2019 18:00:47
Problema Evaluarea unei expresii Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[10005];
int l;
void verifparanteze(int &st , int &dr)
{
    int nr=0,ok=1;
    while(s[st]=='('&& s[dr]==')'&&nr==0 && ok==1)

    {
        nr=0;
        for(int i=st+1;i<=dr-1 && ok==1;i++)
        {
            if(s[i]=='(')
                nr++;
            if(s[i]==')')
                nr--;
            if(nr<0)
                ok=0;
        }
        if(nr==0&&ok==1)
        {
            dr--;
            st++;
        }
    }
}
int cautsemn(int st,int dr,char s1,char s2)
{
    int nr=0;
    for(int i=dr; i>=st; i--)
    {
        if(s[i]==')')
            nr++;
        if(s[i]=='(')
            nr--;

        if(nr==0 && (s[i]==s1 || s[i]==s2))
            return i;
    }
    return -1;
}
int num(int st,int dr)
{
    int numar=0;
    for(int i=st; i<=dr; i++)
        numar=numar*10+(s[i]-'0');
    return numar;
}
int solve(int st,int dr)
{
    verifparanteze(st,dr);

    int poz=cautsemn(st,dr,'+','-');

    if(poz!=-1)
    {
        int e1=solve(st,poz-1);
        int e2=solve(poz+1,dr);

        if(s[poz]=='+')
            return e1+e2;

        return e1-e2;

    }
    poz=cautsemn(st,dr,'*','/');
    if(poz!=-1)
    {
        int e1=solve(st,poz-1);
        int e2=solve(poz+1,dr);
        if(s[poz]=='*')
            return e1*e2;

        return e1/e2;
    }

    return num(st,dr);
}
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    scanf("%s",s);

    l=strlen(s);
    cout<<solve(0,l-1);
    return 0;
}