Cod sursa(job #442216)

Utilizator ChallengeMurtaza Alexandru Challenge Data 13 aprilie 2010 23:19:50
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <string>
#include <vector>

#define VAL	1
#define OP	2

using namespace std;

const char InFile[]="evaluare.in";
const char OutFile[]="evaluare.out";

ifstream fin(InFile);
ofstream fout(OutFile);
string s;

bool IsOp(char ch)
{
	return ch=='+'||ch=='-'||ch=='*'||ch=='/';
}

long int eval(string exp)
{
	vector<long int> v;
	vector<char> op;
	long int val=0;
	long int last=VAL;
	
	if(IsOp(exp[0]))
	{
		v.push_back(0);
		op.push_back(exp[0]);
	}
	
	for(long int i=0;i<(long int)exp.size();++i)
	{
		if(IsOp(exp[i]))
		{
			last=OP;
			op.push_back(exp[i]);
			v.push_back(val);
			val=0;
		}
		else if(exp[i]=='(')
		{
			string str2="";
			int b=1;++i;
			while(i<(long int)exp.size())
			{
				if(exp[i]=='(')
				{
					++b;
				}
				else if(exp[i]==')')
				{
					--b;
					if(b==0)
					{
						break;
					}
				}
				str2=str2+exp[i];
				++i;
			}
			val=eval(str2);
			last=VAL;
		}
		else
		{
			val=val*10+(exp[i]-'0');
			last=VAL;
		}
	}
	if(last==VAL)
	{
		v.push_back(val);
	}
	
	for(long int i=0;i<(long int)op.size();++i)
	{
		if(op[i]=='*')
		{
			v[i]=v[i]*v[i+1];
			op.erase(op.begin()+i);
			v.erase(v.begin()+i+1);
			--i;
		}
		else if(op[i]=='/')
		{
			v[i]=v[i]/v[i+1];
			op.erase(op.begin()+i);
			v.erase(v.begin()+i+1);
			--i;
		}
	}
	
	for(long int i=0;i<(long int)op.size();++i)
	{
		if(op[i]=='-')
		{
			v[0]-=v[i+1];
		}
		else
		{
			v[0]+=v[i+1];
		}
	}
	
	return v[0];
}

int main()
{
	fin>>s;
	fin.close();
	
	fout<<eval(s);
	fout.close();
	return 0;
}