Pagini recente » Cod sursa (job #833222) | Cod sursa (job #3005644) | Cod sursa (job #834270) | Cod sursa (job #1693359) | Cod sursa (job #833228)
Cod sursa(job #833228)
#include <fstream>
#include <iostream>
#include <cstring>
#define MAXN 100000
#define LMAX 2
char op[4][4] = { "+-", "*/", "^", "" };
std::ifstream in("evaluare.in");
std::ofstream out("evaluare.out");
char S[MAXN];
char* p;
struct node
{
char op;
int val;
struct node * l;
struct node * r;
node(int a = 0, char b = 0, struct node *c = 0, struct node *d = 0) : val(a),op(b),l(c),r(d){}
} *root;
node* eval(int lvl);
long eval(node* r);
int main(void) {
in.getline(S,MAXN);
p = S;
root = eval(0);
long r = eval(root);
out << r << std::endl;
return 0;
}
node* eval(int lvl)
{
node* x;
node* y;
if(lvl == LMAX)
{
if(*p == '(')
{
++p;
x = eval(0);
++p;
}
else
{
for(x = new node; *p >= '0' && *p <= '9'; p++)
{
x->val = x->val*10 + *p - '0';
}
}
}
else
{
for(x = eval(lvl+1); strchr(op[lvl], *p) && *p != '\0'; x=y){
y = new node(0, *p++, x, eval(lvl+1));
}
}
return x;
}
long eval(node* r){
long result = 0;
switch(r->op){
case '+':
result = eval(r->l) + eval(r->r);
break;
case '-':
result = eval(r->l) - eval(r->r);
break;
case '*':
result = eval(r->l) * eval(r->r);
break;
case '/':
result = eval(r->l) * eval(r->r);
break;
default:
result = r->val;
break;
}
return result;
}