Cod sursa(job #907593)

Utilizator andrettiAndretti Naiden andretti Data 8 martie 2013 08:29:27
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<fstream>
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

struct stiva
{
    int t;
    char ch;
    int num;
};

stiva e[100005];

int n,p[100005];


void cit()
{
    char c;
    int add=0,sum;


    fin.get(c);
    while(c!='\n')
    {
        while(c==' ' && c!='\n') fin.get(c);

        if(c=='\n') return;

        if(c=='(') add+=10,fin.get(c);
        else
            if(c==')') add-=10,fin.get(c);
            else
             if(c=='+' || c=='-') { n++; e[n].t=1; e[n].ch=c; p[n]=1+add; fin.get(c); }
                else
                    if(c=='*' || c=='/') { n++; e[n].t=1; e[n].ch=c; p[n]=10+add; fin.get(c); }
                    else
                    {
                        n++;
                        e[n].t=2;

                        sum=0;
                        while(c>='0' && c<='9' && c!='\n')
                        {
                            sum=sum*10+c-'0';
                            fin.get(c);
                        }

                        e[n].num=sum;
                        p[n]=1000+add;


                    }
    }
}

int eval(int i,int j)
{
    int hh,h,min;

    min=999999999;
    for(h=i;h<=j;h++)
        if(min>=p[h])
        {
            min=p[h];
            hh=h;
        }

     if(e[hh].t==1)
     {
         if(e[hh].ch=='+') return eval(i,hh-1)+eval(hh+1,j);
         if(e[hh].ch=='-') return eval(i,hh-1)-eval(hh+1,j);
         if(e[hh].ch=='*') return eval(i,hh-1)*eval(hh+1,j);
         if(e[hh].ch=='/') return eval(i,hh-1)/eval(hh+1,j);
     }
     else
       return e[hh].num;
}


int main()
{
    cit();
    fout<<eval(1,n);

    fin.close();
    fout.close();
    return 0;
}