Cod sursa(job #1354304)

Utilizator Vasilica007Hi my name is Vasilica Vasilica007 Data 21 februarie 2015 19:09:17
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cmath>
#include <algorithm>
 
using namespace std;
 
ifstream in("evaluare.in");
ofstream out("evaluare.out");

int lookahead = 0;

int eval_F(const string& s);
int eval_E(const string& s);
int eval_A(const string& s);

int eval_T(const string& s) {
	if(lookahead >= s.size()) return 0;

	int res_F = eval_F(s);

	while(1) {
		int sign = 0;
		if(s[lookahead] == '+') sign = 1;
		else if(s[lookahead] == '-') sign = -1;

		if(!sign) break;

		lookahead++;
		res_F += sign * eval_F(s);
	}

	return res_F;
}

int eval_F(const string& s) {
	if(lookahead >= s.size()) return 0;

	int res_A = eval_A(s);

	while(1) {
		int sign = 0;
		if(s[lookahead] == '*') sign = 1;
		else if(s[lookahead] == '/') sign = -1;

		if(!sign) break;

		lookahead++;
		if(sign > 0) res_A *= eval_A(s);
		else res_A /= eval_A(s);
	}

	return res_A;
}

int match_number(const string& s) {
	int res = 0;

	while(lookahead < s.size() && '0' <= s[lookahead] && s[lookahead] <= '9') {
		res = res * 10 + s[lookahead] - '0';
		lookahead++;
	}

	return res;
}

int eval_A(const string& s) {
	if(lookahead >= s.size()) return 0;
	if('0' <= s[lookahead] && s[lookahead] <= '9') {
		return match_number(s);
	} else if(s[lookahead] == '(') {
		lookahead++;
		int res_E = eval_E(s);
		lookahead++;
		return res_E;
	}

	return 0;
}

int eval_E(const string& s) {
	return eval_T(s);
}
 
int main() {
	string exp;
 
 	in >> exp;
 	cout << eval_E(exp);

    return 0;
}