Cod sursa(job #537108)

Utilizator cdascaluDascalu Cristian cdascalu Data 20 februarie 2011 09:13:21
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream>
#define MAX 100001
using namespace std;
char buf[MAX],semn[MAX];
int v[MAX], ind, inds;
void generate()
{
	int i=0,size = strlen(buf),nr = 0,ok = 0;
	while(i<size)
	{
		nr = ok = 0;
		while(buf[i]>='0' && buf[i]<='9')
		{
			ok = 1;
			nr = nr*10 + int(buf[i]) - int('0');
			++i;
		}
		if(ok)
			v[++ind] = nr;
		if(buf[i] != '\n')
			semn[++inds] = buf[i++];
		else i = size;
	}
}
void scoate_semn(int x)
{
	for(;x<=inds;++x)
		semn[x] = semn[x+1];
	--inds;
}
void scoate_nr(int x)
{
	for(;x<=ind;++x)
		v[x] = v[x+1];
	--ind;
}
int solve(int x)
{
	int i,ok;
	for(i = x;i<=inds;++i)
	{
		if(semn[i] == '(')
		{
			scoate_semn(i);
			solve(i);
		}
	}
	//* || /
	for(i = x;i<=inds && semn[i] != ')';++i)
	{
		ok = 0;
		if(semn[i] == '*')
		{
			v[i]*=v[i+1];
			ok = 1;
		}
		if(semn[i] == '/')
		{
			v[i]/=v[i+1];
			ok = 1;
		}
		if(ok)
		{
			scoate_nr(i+1);
			scoate_semn(i);
			--i;
		}
	}
	//+ || -
	for(i = x;i<=inds && semn[i] != ')';++i)
	{
		ok = 0;
		if(semn[i] == '+')
		{
			v[i]+=v[i+1];
			ok = 1;
		}
		if(semn[i] == '-')
		{
			v[i]-=v[i+1];
			ok = 1;
		}
		if(ok)
		{
			scoate_nr(i+1);
			scoate_semn(i);
			--i;
		}
	}
	if(semn[i] == ')')
		scoate_semn(i);
	return v[x];
}
int main()
{
	ifstream f("evaluare.in");
	f.getline(buf,MAX);
	f.close();
	generate();
	ofstream g("evaluare.out");
	g<<solve(1)<<"\n";
	g.close();
	return 0;
}