Cod sursa(job #2033263)

Utilizator robuvedVictor Robu robuved Data 6 octombrie 2017 15:38:52
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.79 kb
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;

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

const int MAX = 1e5 + 1;
char s[MAX];
char *p = s;

bool isOperator(char c)
{
	return c == '+' || c == '-' || c == '*' || c == '/';
}
int Priority(char c)
{
	switch(c)
	{
		case '-':
		case '+': return 0;
		case '/':
		case '*': return 1;
		case '(': return -1;
	}
}
struct Element
{
	int value;
	bool isOperator;
};
Element fp[MAX];

int Eval();

int Factor()
{
	int f = 0;
	if (*p == '(')
	{
		++p;
		f = Eval();
		p++;
	}
	else
	{
		while (*p >= '0' && *p <= '9')
		{
			f = f * 10 + *p - '0';
			p++;
		}
	}
	return f;
}
int Termen()
{
	int f = Factor();
	while (*p == '*' || *p == '/')
	{
		int c = *p; p++;
		if (c == '*')
		{
			f *= Termen();
		}
		else if (c == '/')
		{
			f /= Termen();
		}
	}
	return f;
}
int Eval()
{
	int t = Termen();
	while (*p == '+' || *p == '-')
	{
		int c = *p; p++;
		if (c == '+')
		{
			t += Termen();
		}
		else if (c == '-')
		{
			t -= Termen();
		}
	}
	return t;
}

int EvalStack(char *s, int len)
{
	stack<char> operatori;
	int k = 0;
	for (int i = 0; i < len; i++)
	{
		char c = s[i];
		if (c == '(')
		{
			operatori.push(s[i]);
		}
		else if (isOperator(c))
		{
			while (!operatori.empty() && Priority(c) <= Priority(operatori.top()))
			{
				Element el;
				el.value = operatori.top();
				el.isOperator = true;
				operatori.pop();
				fp[k++] = el;
			}
			operatori.push(c);
		}
		else if (c == ')')
		{
			while (operatori.top() != '(')
			{
				Element el;
				el.value = operatori.top();
				el.isOperator = true;
				operatori.pop();
				fp[k++] = el;
			}
			operatori.pop();
		}
		else
		{
			int number = c - '0';
			i++;
			while (i < len && s[i] >= '0' && s[i] <= '9')
			{
				number = number * 10 + (s[i] - '0');
				i++;
			}
			i--;
			Element el;
			el.value = number;
			el.isOperator = false;
			fp[k++] = el;
		}
	}
	while (!operatori.empty())
	{
		Element el;
		el.value = operatori.top();
		el.isOperator = true;
		operatori.pop();
		fp[k++] = el;
	}
	stack<int> operanzi;
	for (int i = 0; i < k; i++)
	{
		if (fp[i].isOperator)
		{
			int op1 = operanzi.top();
			operanzi.pop();
			int op2 = operanzi.top();
			operanzi.pop();
			double rez = 0;
			switch (fp[i].value)
			{
			case '-': rez = op2 - op1;
				break;
			case '+': rez = op1 + op2;
				break;
			case '*': rez = op1 * op2;
				break;
			case '/': rez = (double)op2 / op1;
				break;
			}
			operanzi.push(rez);
		}
		else
		{
			operanzi.push(fp[i].value);
		}
	}
	return operanzi.top();
}
int main()
{
	in >> s;
	int len = strlen(s);
	//out << EvalS	tack(s, len) << endl;
	out << Eval() << endl;

}