Cod sursa(job #950098)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 15 mai 2013 20:53:17
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<fstream>
#include<cstring>
#define DMAX 100
#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 s[DMAX];
int i,j,n,pr[DMAX],nr,rez;

nod *creare_arb(int ls,int ld,cell ec[],int pr[])
{
    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,ec,pr),
        c->dr=creare_arb(pminn+1,ld,ec,pr);
    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()
{
    fin.get(s,DMAX);
    n=strlen(s);
    for(i=0;i<n;++i)
        switch (s[i])
        {
            case ')': nr-=10; break;
            case '(': nr+=10; break;
            case '+': pr[j]=nr+1; ec[j++].op=s[i]; break;
            case '-': pr[j]=nr+1; ec[j++].op=s[i]; break;
            case '*': pr[j]=nr+10; ec[j++].op=s[i]; break;
            case '/': pr[j]=nr+10; ec[j++].op=s[i]; break;
            default :
                if(pr[j-1]==INF)
                    ec[j-1].nr*=10,
                    ec[j-1].nr+=(int)s[i]-48;
                else
                    pr[j]=INF,
                    ec[j++].nr=(int)s[i]-48;
                break;
        }
    c=creare_arb(0,j-1,ec,pr);
    calc(c);
    fout<<c->nr;
    return 0;
}