Cod sursa(job #950130)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 15 mai 2013 21:44:52
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<fstream>
#include<cstring>
#define DMAX 100002
#define INF 21000000
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
struct nod
{
    char op;
    int nr;
    nod *st, *dr;
}*c;
union cell
{
    int nr;
    char op;
}ec[DMAX];
char chr;
int i,j,n,pr[DMAX],nr,rez;

nod *creare_arb(int ls,int ld)
{
    nod *c;
    int i,pminn,minn=INF;
    for(i=ls;i<=ld;++i)
        if(pr[i]<=minn)
            minn=pr[i], pminn=i;
    c=new nod;
    if(minn==INF)
        c->nr=ec[pminn].nr;
    else
        c->op=ec[pminn].op;
    if(ls==ld)
        c->st=c->dr=0;
    else
    {
        c->st=creare_arb(ls,pminn-1);
        c->dr=creare_arb(pminn+1,ld);
        switch (c->op)
        {
            case '+': c->nr=c->st->nr+c->dr->nr; break;
            case '-': c->nr=c->st->nr-c->dr->nr; break;
            case '*': c->nr=c->st->nr*c->dr->nr; break;
            case '/': c->nr=c->st->nr/c->dr->nr; break;
        }
    }
    return c;
}

/*void calc(nod *c)
{
    if(c)
    {
        calc(c->st);
        calc(c->dr);
        switch (c->op)
        {
            case '+': c->nr=c->st->nr+c->dr->nr; break;
            case '-': c->nr=c->st->nr-c->dr->nr; break;
            case '*': c->nr=c->st->nr*c->dr->nr; break;
            case '/': c->nr=c->st->nr/c->dr->nr; break;
        }
    }

}*/

int main()
{
    chr=fin.get();
    do
    {
        switch (chr)
        {
            case ')': nr-=10; break;
            case '(': nr+=10; break;
            case '+': pr[j]=nr+1; ec[j++].op=chr; break;
            case '-': pr[j]=nr+1; ec[j++].op=chr; break;
            case '*': pr[j]=nr+10; ec[j++].op=chr; break;
            case '/': pr[j]=nr+10; ec[j++].op=chr; break;
            default :
                if(pr[j-1]==INF)
                    ec[j-1].nr*=10,
                    ec[j-1].nr+=(int)chr-48;
                else
                    pr[j]=INF,
                    ec[j++].nr=(int)chr-48;
                break;
        }
        chr=fin.get();
    }while(chr!='\n');
    c=creare_arb(0,j-1);
    //calc(c);
    fout<<c->nr;
    return 0;
}