Cod sursa(job #1881300)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 16 februarie 2017 12:46:31
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <fstream>
#include <stack>
#include <cstring>

using namespace std;

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

void polak(char*s);
void eval(char*s);
void adauga(char c);
char* sir(char c);

char e[200005], pl[200005], aux[3];
stack<char> S;
stack<int> SS;

int main()
{
	fin.getline(e, 100005);
	polak(e);
	eval(pl);
	return 0;
}

void polak(char*s)
{
	int i, lg;

	lg = strlen(s);
	for (i = 0; i < lg; i++)
		if ('0' <= s[i] && s[i] <= '9')
			strcat(pl, sir(s[i]));
		else
		{
			strcat(pl, sir(' '));
			adauga(s[i]);
		}
	while (!S.empty())
	{
		strcat(pl, sir(S.top()));
		S.pop();
	}
	//fout << pl << '\n';
}

void eval(char*s)
{
	int i, lg, nr = 0, a, b;

	lg = strlen(s);
	i = 0;
	while (i < lg)
	{
		if (('0' <= s[i] && s[i] <= '9'))
		{
			while ('0' <= s[i] && s[i] <= '9')
			{
				nr = nr * 10 + s[i] - '0';
				i++;
			}
			SS.push(nr);
			nr = 0;
		}
		if (s[i] == ' ')
			i++;
		else
		{
			b = SS.top();
			SS.pop();
			a = SS.top();
			SS.pop();
			switch (s[i])
			{
			case '+': a += b; break;
			case '-': a -= b; break;
			case '*': a *= b; break;
			case '/': a /= b; break;
			}
			SS.push(a);
			i++;
		}
	}
	fout << SS.top() << '\n';
}

void adauga(char c)
{
	if (c == '(')
		S.push(c);
	else if (c == ')')
	{
		while (S.top() != '(')
		{
			strcat(pl,sir(S.top()));
			S.pop();
		}
		S.pop();
	}
	else if (c == '/' || c == '*')
	{
		while (!S.empty() && (S.top() == '*' || S.top() == '/'))
		{
			strcat(pl, sir(S.top()));
			S.pop();
		}
		S.push(c);
	}
	else
	{
		while (!S.empty() && S.top()!='(')
		{
			strcat(pl, sir(S.top()));
			S.pop();
		}
		S.push(c);
	}
}

char* sir(char c)
{
	aux[0] = c;
	aux[1] = 0;
	return aux;
}