Cod sursa(job #1199156)

Utilizator howsiweiHow Si Wei howsiwei Data 18 iunie 2014 13:37:06
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <cstdio>
#include <array>
#include <cctype>
using namespace std;

array<int, 256> precedence;
string::const_iterator it;

int apply(char op, int x, int y)
{
	switch (op) {
		case '+': return x+y;
		case '-': return x-y;
		case '*': return x*y;
		case '/': return x/y;
		default: return 0;
	}
}

int eval(int level)
{
	if (level > 2) {
		if (*it == '(') {
			++it;
			int res = eval(1);
			++it;
			return res;
		}
		else {
			int res = 0;
			while (isdigit(*it)) {
				res = res*10+*it-'0';
				++it;
			}
			return res;
		}
	}
	else {
		int res = eval(level+1);
		while (precedence[*it] == level) {
			char op = *it;
			++it;
			res = apply(op, res, eval(level+1));
		}
		return res;
	}
}

int main()
{
	ios::sync_with_stdio(false);
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	precedence['+'] = 1;
	precedence['-'] = 1;
	precedence['*'] = 2;
	precedence['/'] = 2;
	string expr;
	getline(cin, expr);
	expr += '\0';
	it = expr.begin();
	printf("%d\n", eval(1));
	return 0;
}