Cod sursa(job #1295786)

Utilizator eliseiDragoslav Elisei elisei Data 20 decembrie 2014 10:46:16
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<fstream>
#include<iostream>

using namespace std;
char s[100005];
long long q[100005];
int k=-1;
int INF=1000000001;
int o1=1000000002;
int o2=1000000003;
int o3=1000000004;
int o4=1000000005;
void Citire()
{
    ifstream fin("evaluare.in");
    fin>>s;
    fin.close();
}

int Calc(int i)
{
    while(i>=0 && q[i]!=-1) i--;
    int place=i;

    i+=2;
    //*/
    while(i<=k)
    {
        if(q[i]==o3)
        {
            q[i+1]=q[i-1]*q[i+1];
            q[i-1]=q[i]=INF;
        }
        if(q[i]==o4)
        {
            q[i+1]=q[i-1]/q[i+1];
            q[i-1]=q[i]=INF;
        }

        i+=2;
    }

    //+-
    i=place+1;
    while(q[i]>=INF) i++;
    long long n=q[i];


    while(i<=k)
    {
        if(q[i]==o1)
        {
            while(q[i]>=INF) i++;
            n+=q[i];
        }
        if(q[i]==o2)
        {
            while(q[i]>=INF) i++;
            n-=q[i];
        }
        i++;

    }
    k=place;
    q[k]=n;
    return n;

}

void Rez()
{
    int i=0;

    while(s[i]!=0)
    {
        if(s[i]>=48 && s[i]<=58)
        {
            int n=0;
            while(s[i]!=0 && s[i]>=48 && s[i]<=58 )
            {
                n=n*10+(s[i]-48);
                i++;
            }
            q[++k]=n;
        }
        else{
        if(s[i]=='(') q[++k]=-1;
        else if(s[i]=='+') q[++k]=o1;
        else if(s[i]=='-') q[++k]=o2;
        else if(s[i]=='*') q[++k]=o3;
        else if(s[i]=='/') q[++k]=o4;
        else if(s[i]==')')
        {
            Calc(k);

        }
          i++;
        }
    }

}
int main()
{
    Citire();
    Rez();
    long n=Calc(k);
    ofstream fout("evaluare.out");
    fout<<n<<"\n";
    fout.close();
    return 0;
}