Pagini recente » Cod sursa (job #1791999) | Cod sursa (job #640262) | Cod sursa (job #322316) | Cod sursa (job #68135) | Cod sursa (job #948756)
Cod sursa(job #948756)
#include <cstdio>
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <cstring>
#include <string>
#include <set>
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define ll long long
using namespace std;
class node_regex {
private:
int val;
char op;
node_regex* l;
node_regex* r;
public:
node_regex(int a = 0, char b = 0 , node_regex* c = NULL, node_regex* d = NULL) :
val(a) , op(b) , l(c), r(d) {
}
node_regex* getleft() const {
return l;
}
node_regex* getright() const {
return r;
}
int getval() const {
return val;
}
char getop() const {
return op;
}
};
class Parse {
node_regex* Tree;
char *A;
const int LMAX;
char *OP[2];
private:
node_regex* get(int lev) {
node_regex *x, *y;
if (lev == LMAX) {
if (*A == '(') {
A++;
x = get(0);
A++;
} else {
int val = 0;
for (; *A <= '9' && *A >= '0' ; ++A)
val = val * 10 + (*A - '0');
x = new node_regex(val, 0, 0, 0);
// cerr << x -> getval() << " " ;
}
} else {
for (x = get(lev + 1) ; strchr(OP[lev], *A) ; x = y) {
y = new node_regex(0, *A++, x, get(lev + 1)) ;
}
}
return x;
}
int eval(node_regex *x) const{
char op = x -> getop();
if (op == '+')
return eval(x -> getleft()) + eval(x -> getright());
if (op == '-')
return eval(x -> getleft()) - eval(x -> getright());
if (op == '*')
return eval(x -> getleft()) * eval(x -> getright());
if (op == '/')
return eval(x -> getleft()) / eval(x -> getright());
return x -> getval();
}
public:
Parse(char *B) : A(B), LMAX(2) {
OP[0] = "+-";
OP[1] = "*/";
}
int get_things_done() {
Tree = get(0);
return eval(Tree);
}
};
int main() {
const int MAXN = 100005;
char *input_string = new char[MAXN];
freopen("evaluare.in", "r", stdin);
ofstream cout("evaluare.out");
fgets(input_string, MAXN, stdin);
Parse T(input_string);
cout << T.get_things_done();
return 0;
}