Cod sursa(job #700139)

Utilizator balakraz94abcd efgh balakraz94 Data 1 martie 2012 00:11:43
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include<cstring>
#define infile "evaluare.in"
#define outfile "evaluare.out"
#define n_max 100010
#define Lmax 2
using namespace std;


struct nod {
	int val;
	char op;
	nod *l, *r;
	
	nod( int a = 0, char b = 0, nod *c = 0, nod *d = 0 ) : val(a), op(b), l(c), r(d) {}
} *Rad;

char op[4][4] = {"+-", "*/", "^", "" };
char S[n_max], *p;


nod *expr(int lev)
{
	nod *x, *y;
	
	if(lev == Lmax)
		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(lev+1); strchr(op[lev], *p); x = y)
			y = new nod(0, *p++, x, expr(lev+1));
		
	return x;
}


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


int main() 
{ 
	freopen(infile, "r", stdin);
	freopen(outfile, "w", stdout);
	
    fgets( S, n_max, stdin );
    p = S;	
	
	Rad = expr(0);
	
	printf("%d\n", eval(Rad));
	
    fclose(stdin);
	fclose(stdout);
	
    return 0;
}