Pagini recente » Cod sursa (job #3364066) | Cod sursa (job #3362182) | Cod sursa (job #3363974) | Cod sursa (job #3363980) | Cod sursa (job #3363695)
#include <bits/stdc++.h>
const int NMAX = (1 << 17);
const int LMAX = 2;
std::string str;
size_t idx;
bool is_math_symbol(char c)
{
return (
c == '*' ||
c == '/' ||
c == '+' ||
c == '-'
);
}
struct node
{
int val;
char op;
node *l, *r;
node(int _val = 0, char _op = 0, node *_l = 0, node *_r = 0) : val(_val), op(_op), l(_l), r(_r) {};
} *arb;
// Construction of the expression tree
node *expr(int lev)
{
node *x, *y;
if(lev == LMAX)
{
if(str[idx] == '(')
{
++idx;
x = expr(0);
++idx;
}
else
{
for(x = new node(); str[idx] >= '0' && str[idx] <= '9'; ++idx)
{
x->val = x->val * 10 + str[idx] - '0';
}
}
}
else
{
for(x = expr(lev + 1); is_math_symbol(str[idx]); x = y, ++idx)
{
y = new node(0, str[idx], x, expr(lev + 1));
}
}
return x;
}
int eval(node *_arb)
{
switch (_arb->op)
{
case '+':
return (eval(_arb->l) + eval(_arb->r));
break;
case '-':
return (eval(_arb->l) - eval(_arb->r));
break;
case '*':
return (eval(_arb->l) * eval(_arb->r));
break;
case '/':
return (eval(_arb->l) / eval(_arb->r));
break;
default:
return _arb->val;
break;
}
}
std::ifstream fin("expresie.in");
std::ofstream fout("expresie.out");
int main()
{
fin >> str;
arb = expr(0);
fout << eval(arb);
return 0;
}