Cod sursa(job #2871134)

Utilizator widzAndrei-Daniel Tava widz Data 12 martie 2022 21:37:19
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <string>

using namespace std;

string::iterator findPair(string::iterator pos)
{
	int count = 1;
	if (*pos == '(')
	{
		while (count)
		{
			++pos;
			if (*pos == '(')
				++count;
			if (*pos == ')')
				--count;
		}
	}
	if (*pos == ')')
	{
		while (count)
		{
			--pos;
			if (*pos == '(')
				--count;
			if (*pos == ')')
				++count;
		}
	}

	return pos;
}

int eval(string::iterator left, string::iterator right)
{
	for(auto it = right-1; it > left; --it)
	{
		if (*it == ')')
		{
			it = findPair(it);
			if (it == left)
				break;
		}
		if (*it == '+' || *it == '-')
		{
			auto lft = it;
			if (*(lft - 1) == ')' && left == findPair(lft - 1))
			{
				++left;
				--lft;
			}
			auto rht = it + 1;
			if (*rht == '(' && right - 1 == findPair(rht))
			{
				--right;
				++rht;
			}
			if (*it == '+')
				return eval(left, lft) + eval(rht, right);
			else
				return eval(left, lft) - eval(rht, right);
				
			
		}
	}
	for (auto it = right - 1; it > left; --it)
	{
		if (*it == ')')
		{
			it = findPair(it);
			if (it == left)
				break;
		}
		if (*it == '*' || *it == '/')
		{
			auto lft = it;
			if (*(lft - 1) == ')' && left == findPair(lft - 1))
			{
				++left;
				--lft;
			}
			auto rht = it + 1;
			if (*rht == '(' && right - 1 == findPair(rht))
			{
				--right;
				++rht;
			}
			if (*it == '*')
				return eval(left, lft) * eval(rht, right);
			else
				return eval(left, lft) / eval(rht, right);


		}
	}
	int res = 0;
	for (auto it = left; it != right; ++it)
		res = res * 10 + (* it - 48);
	return res;
}

int main()
{
	ifstream in("evaluare.in");
	string expr;
	in >> expr;
	in.close();
	ofstream out("evaluare.out");
	auto beg = expr.begin();
	auto end = expr.end();
	if( *beg == '(' && findPair(beg) == end - 1)
	{
		++beg;
		--end;
	}
	out << eval(beg, end);
	out.close();
	return 0;
}