Cod sursa(job #1393861)

Utilizator PatrikStepan Patrik Patrik Data 19 martie 2015 20:04:59
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<string.h>

#define LMAX 1000001

char s[LMAX] , *p , op[2][3] = { "+-" , "*/" };

struct nod{
	int val;
	char op;
	nod *l  ,*r ;
}*rad;

nod *construct(int lev);
int eval(nod *n);

int main()
{
	freopen("evaluare.in" , "r" , stdin );
	freopen("evaluare.out" , "w", stdout );
	scanf("%s" , s );
	p = s;
	rad = construct(0);
	printf("%d\n" , eval(rad));
	return 0;
}

nod *construct(int lev)
{
	nod *x , *y;
	if(lev == 2)
		if(*p == '('){
	   		p++;
			 x = construct(0);
			 p++;
		}
		else
		{
			x = new nod;
			x->val = x->op = 0 ;
			x->l = x->r = 0;
			while( *p >= '0' && *p <= '9')
				x->val = x->val *10 + *p++ - 48;
		}
	else
		for(x = construct(lev+1) ;*p && strchr(op[lev],*p) ; x = y)
		{
			y = new nod;
			y->val = 0;
			y->op = *p++;
			y->l = x;
			y->r = construct(lev+1);
		}
	return x;
}

int eval(nod *n)
{
	switch(n->op){
		case '+' :
			return eval(n->l) + eval(n->r);
			break;
		case '-' :
			return eval(n->l) - eval(n->r);
			break;
		case '*':
			return eval(n->l) * eval(n->r);
			break;
		case '/':
			return eval(n->l) / eval(n->r);
			break;
		default:
			return n->val;
	}
}