Cod sursa(job #948756)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 11 mai 2013 15:19:50
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#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;
}