Cod sursa(job #150216)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 6 martie 2008 19:05:46
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<fstream.h>
#include<string.h>
char a[100000],c,b[100000];
long vb1,i,nr,n,vb,vx,par[100000],vp,nrx[100000],vn,j;
long x[100000];
ifstream f("evaluare.in");
ofstream g("evaluare.out");
int main()
{
f.getline(a,1000);
n=strlen(a);
for(i=0;i<n;i++)
	{
	if(a[i]>='0' && a[i]<='9')
		{
		x[vx]=a[i]-'0';
		vx++;
		}
	else
		{
		if(a[i]=='+')
			{
			while(b[vb-1]=='*' || b[vb-1]=='/')
			{
			while(b[vb-1]=='*')
				{
				x[vx-2]=x[vx-2]*x[vx-1];
				vx--;
				vb--;
				}
			while(b[vb-1]=='/')
				{
				x[vx-2]=x[vx-2]/x[vx-1];
				vb--;
				vx--;
				}
			}
			b[vb]='+';
			vb++;
			}
		else
			if(a[i]=='-')
				{
				while(b[vb-1]=='*' || b[vb-1]=='/')
				{
				while(b[vb-1]=='*')
					{
					x[vx-2]=x[vx-2]*x[vx-1];
					vx--;
					vb--;
					}
				while(b[vb-1]=='/')
					{
					x[vx-2]=x[vx-1]/x[vx-2];
					vb--;
					vx--;
					}
				}
				b[vb]='-';
				vb++;
				}
			else
				if(a[i]=='*')
					{
					b[vb]='*';
					vb++;
					}
				else
				if(a[i]=='/')
					{
					b[vb]='/';
					vb++;
					}
				else
			if(a[i]=='(')
				{
				b[vb]='(';
				par[vp]=vb;
				nrx[vn]=vx;
				vn++;
				vp++;
				vb++;
				}
			else
			if(a[i]==')')
				{
				vb1=vb;
				for(j=par[vp-1]+1;j<vb1;j++)
					{
					switch(b[j])
						{
						case '+':x[nrx[vn-1]]+=x[nrx[vn-1]+j-par[vp-1]];break;
						case '-':x[nrx[vn-1]]-=x[nrx[vn-1]+j-par[vp-1]];break;
						case '*':x[nrx[vn-1]]*=x[nrx[vn-1]+j-par[vp-1]];break;
						case '/':x[nrx[vn-1]]/=x[nrx[vn-1]+j-par[vp-1]];break;
						}
					vx--;
					vb--;
					}
				vn--;
				vb--;
				vp--;
				}

		}


	}
while(vb>0)
	{
	switch(b[vb-1])
		{
		case '+':x[vx-2]+=x[vx-1];break;
		case '-':x[vx-2]-=x[vx-1];break;
		case '*':x[vx-2]*=x[vx-1];break;
		case '/':x[vx-2]/=x[vx-1];break;
		}
	vx--;
	vb--;
	}
g<<x[0];
g.close();
return 0;
}