Pagini recente » Cod sursa (job #3361929) | Cod sursa (job #3363600) | Cod sursa (job #3361946) | Cod sursa (job #3363837) | Cod sursa (job #3363726)
#include <bits/stdc++.h>
const int NMAX = (1 << 17);
const int LMAX = 2;
std::string str;
size_t idx;
char op[4][4] = { "+-", "*/", "^", "" };
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); strchr(op[lev], str[idx]); x = y)
{
y = new node(0, str[idx], x, expr(lev + 1));
++idx;
}
}
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("evaluare.in");
std::ofstream fout("evaluare.out");
int main()
{
fin >> str;
arb = expr(0);
fout << eval(arb);
return 0;
}