Cod sursa(job #984286)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 13 august 2013 23:43:24
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <fstream>
#include <string>
#include <sstream>
#include <stack>

void parse(std::string& str, std::stringstream& nstr)
{
	std::stack<char> myS;
	for(unsigned i = 0; i < str.length();)
	{
		if(str[i] == '(') myS.push('(');
		else if(str[i] == ')')
		{
			while(myS.top() != '(')
			{
				nstr << myS.top();
				nstr << ' ';
				myS.pop();
			}
			myS.pop();
		}
		else if(str[i] == '+' || str[i] == '-')
		{
			while(!myS.empty() && myS.top() != '(')
			{
				nstr << myS.top();
				nstr << ' ';
				myS.pop();
			}
			myS.push(str[i]);
		}
		else if(str[i] == '*' || str[i] == '/')
		{
			while(!myS.empty() && myS.top() != '(' && myS.top() != '+' && myS.top() != '-')
			{
				nstr << myS.top();
				nstr << ' ';
				myS.pop();
			}
			myS.push(str[i]);
		}
		else
		{
			while(str[i] >= '0' && str[i] <= '9')
			{
				nstr << str[i];
				i++;
			}
			nstr << ' ';
			continue;
		}
		i++;
	}
	while(!myS.empty())
	{
		nstr << myS.top();
		nstr << ' ';
		myS.pop();
	}
}

long long reg(std::string& str)
{
	std::stack<int> myS;
	std::stringstream nstr;
	parse(str, nstr);
	int a, b;
	char c = nstr.get();
	while(c != -1)
	{
		if(c >= '0' && c <= '9')
		{
			std::stringstream nr;
			while(c >= '0' && c <= '9')
			{
				nr << c;
				c = nstr.get();
			}
			nr >> a;
			myS.push(a);
			continue;
		}
		else if(c == '+')
        {
            b = myS.top();
            myS.pop();
            a = myS.top();
            myS.pop();
            myS.push(a + b);
        }
        else if(c == '-')
        {
            b = myS.top();
            myS.pop();
            a = myS.top();
            myS.pop();
            myS.push(a - b);
        }
        else if(c == '*')
        {
            b = myS.top();
            myS.pop();
            a = myS.top();
            myS.pop();
            myS.push(a * b);
        }
        else if(c == '/')
        {
            b = myS.top();
            myS.pop();
            a = myS.top();
            myS.pop();
            myS.push(a / b);
        }
        c = nstr.get();
	}
	return myS.top();
}

int main()
{
	std::ifstream in("evaluare.in");
	std::ofstream out("evaluare.out");
	std::string str, nstr;
	getline(in, str);
	out << reg(str);
	return 0;
}