Cod sursa(job #156472)

Utilizator plastikDan George Filimon plastik Data 12 martie 2008 16:18:26
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <string.h>
#define NMAX 100002

char Exp[NMAX];

long evalExp(int l, int r) {
	if (Exp[l] == '(' && Exp[r] == ')')
		return evalExp(l + 1, r - 1);

	int nPar = 0, iDiv = -1, i;

	for (i = r; i >= l; -- i) {
		if (Exp[i] == ')') {
			++ nPar;
			continue;
		}
		if (Exp[i] == '(') {
			-- nPar;
			continue;
		}

		if (nPar == 0) {
			if (Exp[i] == '+')
				return evalExp(l, i - 1) + evalExp(i + 1, r);
			if (Exp[i] == '-')
				return evalExp(l, i - 1) - evalExp(i + 1, r);

			if (Exp[i] == '*' || Exp[i] == '/')
				iDiv = i;
		}
	}

	if (iDiv != -1)
		if (Exp[iDiv] == '*')
			return evalExp(l, iDiv - 1) * evalExp(iDiv + 1, r);
		else
			return evalExp(l, iDiv - 1) / evalExp(iDiv + 1, r);

	long x;
	sscanf(Exp + l, "%ld", &x);
	return x;
}

int main() {

	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);

	scanf("%s", Exp);
	long ans = evalExp(0, strlen(Exp) - 1);
	printf("%ld\n", ans);

	return 0;
}