Pagini recente » Istoria paginii runda/gigel_si_nemuritorii | Cod sursa (job #1574234) | Cod sursa (job #1801545) | Cod sursa (job #1464) | Cod sursa (job #2269997)
#include <cstdio>
#include <cstring>
using namespace std;
const int LMAX = 2,
NMAX = 100001;
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)
{}
};
char op[2][4] = {"+-", "*/"};
char S[100001], *p;
nod *R;
nod *construct(int lev) {
nod *x, *y;
if(lev == LMAX) {
if(*p == '(') ++p, x = construct(0), ++p;
else for(x = new nod(); *p >= '0' && *p <= '9'; ++p)
x->val = x->val * 10 + *p - '0';
} else
for(x = construct(lev+1); strchr(op[lev], *p); x = y)
y = new nod(0, *p++, x, construct(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("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
fgets(S, NMAX, stdin);
p = S;
R = construct(0);
printf("%i", eval(R));
return 0;
}