Cod sursa(job #2852568)

Utilizator Radu_marioRadu Mario Radu_mario Data 19 februarie 2022 13:33:48
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <string>
#include <stack>
using namespace std;

ifstream file_in("evaluare.in");
ofstream file_out("evaluare.out");

int i;
string Expresie;

int Operatie(int Termen_1, int Termen_2, char Operator)
{
	switch (Operator)
	{
	case '+': return Termen_1 + Termen_2;
	case '-': return Termen_1 - Termen_2;
	case '*': return Termen_1 * Termen_2;
	case '/': return Termen_1 / Termen_2;
	default: return 0;
	}
}

int Prioritate(char Operator)
{
	if (Operator == '+' || Operator == '-') return 1;
	if (Operator == '*' || Operator == '/') return 2;
	return 0;
}

int EvaluareExpresie(string Expresie)
{
	stack<int> Operanzi;
	stack<char> Operatori;
	size_t Lungime = Expresie.length();
	int Termen_1, Termen_2, Valoare;
	char Operator;

	for (i = 0; i < Lungime; ++i)
	{
		if (Expresie[i] == '(') Operatori.push(Expresie[i]);
		else if (Expresie[i] == ')')
		{
			while (!Operatori.empty() && Operatori.top() != '(')
			{
				Termen_2 = Operanzi.top();
				Operanzi.pop();

				Termen_1 = Operanzi.top();
				Operanzi.pop();

				Operator = Operatori.top();
				Operatori.pop();

				Operanzi.push(Operatie(Termen_1, Termen_2, Operator));
			}
			Operatori.pop();
		}
		else if (isdigit(Expresie[i]))
		{
			Valoare = 0;
			while (i < Lungime && isdigit(Expresie[i]))
				Valoare = Valoare * 10 + (Expresie[i] - '0'), ++i;

			Operanzi.push(Valoare);
			--i;
		}
		else
		{
			while (!Operatori.empty() && Prioritate(Operatori.top()) >= Prioritate(Expresie[i]))
			{
				Termen_2 = Operanzi.top();
				Operanzi.pop();

				Termen_1 = Operanzi.top();
				Operanzi.pop();

				Operator = Operatori.top();
				Operatori.pop();

				Operanzi.push(Operatie(Termen_1, Termen_2, Operator));
			}
			Operatori.push(Expresie[i]);
		}
	}

	while (!Operatori.empty())
	{
		Termen_2 = Operanzi.top();
		Operanzi.pop();

		Termen_1 = Operanzi.top();
		Operanzi.pop();

		Operator = Operatori.top();
		Operatori.pop();

		Operanzi.push(Operatie(Termen_1, Termen_2, Operator));
	}

	return Operanzi.top();
}

int main()
{
	file_in >> Expresie;
	file_out << EvaluareExpresie(Expresie);
	return 0;
}