Pagini recente » Cod sursa (job #2491495) | Cod sursa (job #1784339) | Cod sursa (job #2484072) | Cod sursa (job #2839562) | Cod sursa (job #442769)
Cod sursa(job #442769)
#include <stdio.h>
#define NMAX 100010
char str[NMAX],*p=str;
typedef enum Level {
EXP=0,TER,FAC
}Level;
typedef struct nod {
int val;
char op;
nod *s,*d;
nod(int _val = 0 , char _op = 0 , nod* _s = NULL , nod* _d = NULL): val(_val) , op(_op) , s(_s) , d(_d) {}
}nod;
nod* Arb(Level level){
nod *aux = NULL;
if(level == EXP){
aux = Arb(TER);
while(*p=='+'||*p=='-') {
char op = *p; ++p;
aux = new nod( 0 , op , aux , Arb(TER) );
}
}
if(level == TER){
aux = Arb(FAC);
while(*p=='*'||*p=='/') {
char op = *p; ++p;
aux = new nod( 0 , op , aux , Arb(FAC) );
}
}
if(level == FAC){
if(*p=='('){
++p; aux = Arb(EXP); ++p;
} else {
aux = new nod;
while(*p>='0' && *p<='9')
aux->val = aux->val*10 + *p-'0' , ++p;
}
}
return aux
;
}
int eval(nod* Nod){
if(Nod->op =='+') return eval(Nod->s) + eval(Nod->d);
if(Nod->op =='-') return eval(Nod->s) - eval(Nod->d);
if(Nod->op =='*') return eval(Nod->s) * eval(Nod->d);
if(Nod->op =='/') return eval(Nod->s) / eval(Nod->d);
return Nod->val;
}
int main(){
freopen("evaluare.in","rb",stdin);
freopen("evaluare.out","w",stdout);
fread(str, sizeof(char), NMAX, stdin);
printf("%d\n",eval( Arb(EXP) ) );
return 0;
}