Pagini recente » Cod sursa (job #1854707) | Cod sursa (job #1905449) | Cod sursa (job #1974927) | Cod sursa (job #2067499) | Cod sursa (job #3331958)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
#define LMAX 2
char op[4][4] = { "+-", "*/", "^", "" };
#define NX (1<<17)
char S[ NX ], *p;
struct node
{
int val;
char op;
node *l, *r;
node(int a = 0, char b = 0, node *c = 0, node *d = 0) :
val(a), op(b), l(c), r(d) {}
} *A;
node *expr(int lev)
{
node *x, *y;
if(lev == LMAX)
if(*p == '(')
++p, x = expr(0), ++p;
else
for(x = new node(); *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 node(0, *p++, x, expr(lev + 1));
return x;
}
int eval(node *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()
{
fin >> S;
p = S;
A = expr(0);
fout << eval(A);
return 0;
}