Cod sursa(job #153713)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 10 martie 2008 18:15:06
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<fstream.h>
#include<string.h>
char a[100010],b[100010];
long par[100010],vpar,xpar[100010],vxpar,n,xpm[100010],vxpm,pm[100010],vpm,i,vb,x[100010],vx;

ifstream f("evaluare.in");
ofstream g("evaluare.out");
void plus_minus()
{
int s;
if(vpm>0)
{
for(s=pm[vpm-1]+1;s<vb;s++)
	{
	if(b[s]=='*')
		{
		x[xpm[vxpm-1]]*=x[xpm[vxpm-1]+s-pm[vpm-1]];
		vb--;
		vx--;
		}
	else
		if(b[i]=='/')
			{
			x[xpm[vxpm-1]]/=x[xpm[vxpm-1]+s-pm[vpm-1]];
			vb--;
			vx--;
			}

	}
}
b[vb++]=a[i];
}
void ori_supra()
{
b[vb]=a[i];
vb++;
pm[vpm++]=vb-1;
xpm[vxpm++]=vx-1;
}
int numar()
{
int nr=0;
while(a[i]>='0' && a[i]<='9')
	{
	nr=nr*10+a[i]-'0';
	i++;
	}
i--;
return nr;
}
void par_d()
{
b[vb++]=a[i];
par[vpar++]=vb-1;
xpar[vxpar++]=vx;
pm[vpm++]=vb;
xpm[vxpm++]=vx;
}
void par_i()
{
int s;
for(s=par[vpar-1]+1;s<vb;s++)
	{
	switch(b[s])
		{
		case '+':x[xpar[vxpar-1]]+=x[xpar[vxpar-1]+s-par[vpar-1]];break;
		case '-':x[xpar[vxpar-1]]-=x[xpar[vxpar-1]+s-par[vpar-1]];break;
		case '*':x[xpar[vxpar-1]]*=x[xpar[vxpar-1]+s-par[vpar-1]];break;
		case '/':x[xpar[vxpar-1]]/=x[xpar[vxpar-1]+s-par[vpar-1]];break;
		}
	}
vb=par[vpar-1];
vx=xpar[vxpar-1]+1;
vpar--;
vxpar--;
}
int main()
{
f>>a;
n=strlen(a);
i=0;
while(i<n)
	{
	if(a[i]>='0' && a[i]<='9')
		{
		x[vx]=numar();
		vx++;
		}

	else
		if(a[i]=='-' || a[i]=='+')
			plus_minus();
		else
			if(a[i]=='*' || a[i]=='/')
				ori_supra();
			else
				if(a[i]=='(')
					par_d();
				else
					if(a[i]==')')
						par_i();

	i++;
	}
for(i=0;i<vb;i++)
	{
	switch(b[i])
		{
		case '*':x[i]*=x[i+1];break;
		case '/':x[i]/=x[i+1];break;
		}
	}
for(i=0;i<vb;i++)
	{
	switch(b[i])
		{
		case '+':x[0]+=x[i+1];break;
		case '-':x[0]-=x[i+1];break;
		}
	}
g<<x[0]<<'\n';
g.close();
return 0;
}