Cod sursa(job #2871491)

Utilizator widzAndrei-Daniel Tava widz Data 14 martie 2022 21:03:01
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 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!= right-1 )
		{
			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!= right-1)
		{
			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();
	out << eval(beg, end);
	out.close();
	return 0;
}