Cod sursa(job #442769)

Utilizator nashnash mit nash Data 15 aprilie 2010 10:11:43
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#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;
}