Pagini recente » Cod sursa (job #513497) | Cod sursa (job #1945402) | Cod sursa (job #2540600) | Cod sursa (job #1646729) | Cod sursa (job #1393861)
#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;
}
}