Cod sursa(job #1143141)

Utilizator federerUAIC-Padurariu-Cristian federer Data 14 martie 2014 20:09:42
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 4.23 kb
//#include "ArboreBinar.h"
#include<iostream>
#include<sstream>
#include<stack>
#include<fstream>
using namespace std;

class ArboreBinar
{
	char cOperator;
	//double dNumber;
	long long dNumber;
	ArboreBinar *stg, *drp;
	bool valid;

	ArboreBinar(double);
	ArboreBinar(char);

public:
	static string InfixPostfix(const string& expresie);
	ArboreBinar();
	ArboreBinar(string& expresie);
	bool EsteValid();
	string Parcurgere(int nCodParcurgere);
	long long Evalueaza(ArboreBinar*);
};


ArboreBinar::ArboreBinar()
{

	cOperator = '\0';
	dNumber = 0;
	stg = drp = NULL;
	valid = false;
}
ArboreBinar::ArboreBinar(double nr)
{
	cOperator = '\0';
	dNumber = nr;
	stg = drp = NULL;
	valid = true;
}
ArboreBinar::ArboreBinar(char ch)
{
	cOperator = ch;
	dNumber = 0;
	stg = drp = NULL;
	valid = true;
}
ArboreBinar::ArboreBinar(string& expresie)
{
	ArboreBinar *nr, *op;
	stack<ArboreBinar*>aStack;
	string number;
	int l = expresie.size(), i=0;
	char aChar;
	while (i < l)
	{
		aChar = expresie[i];
		switch (aChar)
		{
		case ' ': aChar=expresie[++i]; break;
			case '.':
			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
				number = "";
				do
				{
					number += aChar;
					aChar = expresie[++i];
				} while ((isdigit(aChar) || aChar == '.') && i < l - 1);
				nr = new ArboreBinar(atof(number.c_str()));
				aStack.push(nr); break;
			case '-':
			case '+':
			case '*':
			case '/':
				op = new ArboreBinar(aChar);
				op->drp = aStack.top();
				aStack.pop();
				op->stg = aStack.top();
				aStack.pop();
				aStack.push(op);
				i++;
				break;
		}
	}
	cOperator = aStack.top()->cOperator;
	dNumber = aStack.top()->dNumber;
	stg = aStack.top()->stg;
	drp = aStack.top()->drp;
	valid = aStack.top()->valid;
}
string ArboreBinar::InfixPostfix(const string& expresie)
{
	stringstream stream;
	string number;
	stream << expresie;
	stack<string> aStack;
	string postExpresie;
	string sign;
	char chSpace = ' ';

	while (stream)
	{
		string strNumar;
		string strOperator;
		char aChar = stream.peek();
		switch (aChar)
		{
		case ' ': stream.ignore(); continue;
		case '.':
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			stream.ignore();
			number = "";
			do
			{
				number += aChar;
				aChar = stream.peek();
				stream.ignore();
			} while (isdigit(aChar) || aChar=='.');
			stream.putback(aChar);
			postExpresie += number;
			postExpresie += chSpace; break;
		case '+':
		case '-':
			stream.ignore();
			while ((!aStack.empty()) && ((aStack.top() == "*") || (aStack.top() == "/")))
			{
				postExpresie += aStack.top();
				postExpresie += chSpace;
				aStack.pop();
			}
			sign = "";
			sign += aChar;
			aStack.push(sign); break;
		case '*':
		case '/':
			sign = "";
			stream.ignore();
			sign += aChar;
			aStack.push(sign); break;
			break;
		case '(':
			stream.ignore();
			aStack.push("(");
			break;
		case ')':
			stream.ignore();
			while ((!aStack.empty()) && (aStack.top() != "("))
			{
				postExpresie += aStack.top();
				postExpresie += chSpace;
				aStack.pop();
			}
			if (!aStack.empty())
				aStack.pop();
			break;
		case EOF: continue;
		default:cout << "Eroare la parsarea expresiei!";
			break;
		}
	}
	while (!aStack.empty())
	{
		postExpresie += aStack.top();
		postExpresie += chSpace;
		aStack.pop();
	}
	return postExpresie;
}
long long ArboreBinar::Evalueaza(ArboreBinar *A)
{
	if (A->stg == NULL && A->drp == NULL)
		return A->dNumber;
	else
	{
		switch(A->cOperator)
		{
		case '+': return Evalueaza(A->stg) + Evalueaza(A->drp); break;
		case '-': return Evalueaza(A->stg) - Evalueaza(A->drp); break;
		case '*': return Evalueaza(A->stg) * Evalueaza(A->drp); break;
		case '/': return Evalueaza(A->stg) / Evalueaza(A->drp); break;
		}
	}
}
int main()
{
	ifstream fin("evaluare.in");
	ofstream fout("evaluare.out");
	string exp;
	fin >> exp;
	string exp2;
	exp2 = ArboreBinar::InfixPostfix(exp);
	ArboreBinar *Arb;
	Arb = new ArboreBinar(exp2);
	long long a=(*Arb).Evalueaza(Arb);
	fout << a << '\n';
	return 0;
}