Cod sursa(job #392720)

Utilizator vicenzo_cnuStan Alexandru Dan vicenzo_cnu Data 8 februarie 2010 08:33:20
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<cstring>
#include<cstdio>
#define LM 2
#define NX 100000
typedef struct nod * pnod;
struct nod {int val;char op;pnod st;pnod dr;

nod(int a=0,char b=' ',pnod l=NULL,pnod r=NULL ){val=a,op=b,st=l,dr=r;}
};
pnod A=NULL;
char S[NX],*p;
char ad[4][4]={"+-","*/","^",""};

pnod expr(int t)
{pnod x,y; 
  if(t==LM)
    if(*p=='(')
      ++p,x=expr(0),++p; 
    else for(x=new nod();*p>='0' && *p<='9';++p)
          x->val=x->val * 10 +*p-'0';
  else for(x=expr(t+1);strchr(ad[t],*p);x=y)
      y=new nod(0,*p++,x,expr(t+1));
  return x;
}

int eval(pnod p)
{switch(p->op)
 { case '+' : return eval(p->st)+eval(p->dr);
  case '-' : return eval(p->st)-eval(p->dr);
  case '*' : return eval(p->st)*eval(p->dr);
  case '/' : return eval(p->st)/eval(p->dr);
  default : return p->val;
}
}
void afisare(pnod x)
{
if(x->val)
{printf("%d ",x->val);return;}
else printf("%c ",x->val);
afisare(x->st);
afisare(x->dr);
}

int main()
{freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
//scanf("%s",S);
fgets(S,NX,stdin);
p=S;
A=expr(0);
//afisare(A);
//printf("%c ",A->dr->op);
printf("%d\n",eval(A));
fclose(stdin);
fclose(stdout);
return 0;
}