Cod sursa(job #2641013)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 9 august 2020 16:18:52
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.18 kb
#include <fstream>

using namespace std;
long long l,k,w[100005],tr[100005];
char ch[100005];
long long fu(long long x, long long y)
{
    int i=x,x1=0,x2=0,x3=0;
    char c1='+',c2='+';
    while(i<=y)
    {
        if(ch[i]=='(')
        {
            x3=fu(i+1,tr[i]-1);
            i=tr[i];
        }
        else if(ch[i]>='0'&&ch[i]<='9')
        {
            x3*=10;
            x3+=ch[i]-'0';
        }
        else
        {
            if((c1=='*')||(c1=='/')||(c2=='+')||(c2=='-'))
            {
                if(c1=='+')
                {
                    x1+=x2;
                    x2=x3;
                    x3=0;
                    c1=c2;
                    c2=ch[i];
                }
                else if(c1=='-')
                {
                    x1-=x2;
                    x2=x3;
                    x3=0;
                    c1=c2;
                    c2=ch[i];
                }
                else if(c1=='*')
                {
                    x1*=x2;
                    x2=x3;
                    x3=0;
                    c1=c2;
                    c2=ch[i];
                }
                else if(c1=='/')
                {
                    x1/=x2;
                    x2=x3;
                    x3=0;
                    c1=c2;
                    c2=ch[i];
                }
            }
            else
            {
                if(c2=='*')
                {
                    x2*=x3;
                    x3=0;
                    c2=ch[i];
                }
                else
                {
                    x2/=x3;
                    x3=0;
                    c2=ch[i];
                }
            }
        }
        i++;
    }
    if((c1=='*')||(c1=='/')||(c2=='+')||(c2=='-'))
    {
        if(c1=='+')
        {
            x1+=x2;
            x2=x3;
            x3=0;
            c1=c2;
            c2=ch[i];
        }
        else if(c1=='-')
        {
            x1-=x2;
            x2=x3;
            x3=0;
            c1=c2;
            c2=ch[i];
        }
        else if(c1=='*')
        {
            x1*=x2;
            x2=x3;
            x3=0;
            c1=c2;
            c2=ch[i];
        }
        else if(c1=='/')
        {
            x1/=x2;
            x2=x3;
            x3=0;
            c1=c2;
            c2=ch[i];
        }
    }
    else
    {
        if(c2=='*')
        {
            x2*=x3;
            x3=0;
            c2=ch[i];
        }
        else
        {
            x2/=x3;
            x3=0;
            c2=ch[i];
        }
    }
    if(c1=='*') x1*=x2;
    if(c1=='/') x1/=x2;
    if(c1=='+') x1+=x2;
    if(c1=='-') x1-=x2;
    return x1;
}
int main()
{
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");
    f>>ch;
    while(ch[l]) l++;
    for(int i=l; i>=1; i--) ch[i]=ch[i-1];
    for(int i=1; i<=l; i++)
    {
        if(ch[i]=='(')
        {
            k++;
            w[k]=i;
        }
        if(ch[i]==')')
        {
            tr[w[k]]=i;
            w[k]=0;
            k--;
        }
    }
    g<<fu(1,l);
    f.close(); g.close();
    return 0;
}