Cod sursa(job #3230784)

Utilizator ClassicalClassical Classical Data 22 mai 2024 20:12:52
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;

string s;
int p;

int f1();
int f2();
int f3();

int f1() {
	int x = f2();
	while (p < (int) s.size() && s[p] == '+' || s[p] == '-') {
		int sgn = +1;
		if (s[p] == '-') {
			sgn = -1;
		}
		p++;
		x += sgn * f2();
	}
	return x;
}

int f2() {
	int x = f3();
	while (p < (int) s.size() && s[p] == '*' || s[p] == '/') {
		int type = 0;
		if (s[p] == '/') {
			type = 1;
		}
		p++;
		int y = f3();
		if (type == 0) {
			x *= y;
		} else {
			x /= y;
		}
	}
	return x;
}

int f3() {
	assert(p < (int) s.size());
	if (s[p] == '-') {
		p++;
		return -f3();
	}
	if (s[p] == '+') {
		p++;
		return -f3();
	}
	if (s[p] == '(') {
		p++;
		int sol = f1();
		assert(p < (int) s.size());
		assert(s[p] == ')');
		p++;
		return sol;
	}
	int nr = 0;
	while (p < (int) s.size() && '0' <= s[p] && s[p] <= '9') {
		nr = 10 * nr + s[p] - '0';
		p++;
	}
	return nr;
}

int main() {
#ifdef INFOARENA
	freopen ("evaluare.in", "r", stdin);
	freopen ("evaluare.out", "w", stdout);
#endif
	
	cin >> s;
	cout << f1() << "\n";
	return 0;
}