Cod sursa(job #154298)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 11 martie 2008 09:04:51
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream.h>
#include<string.h>
char a[100010],b[100010],c;
long x[100010],vx,vb,po,ps,i,n;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
long numar(long &i)
{
long nr=0;
while(i<n && a[i]>='0' && a[i]<='9')
	{
	nr=nr*10+a[i]-'0';
	i++;
	}
i--;
return nr;
}
int pri(char c)
{
switch(c)
	{
	case '+':case '-':return 1;
	case '*':case '/':return 2;
	case '(':return 0;
	}
return 0;
}
void efectueaza(long &q,long w,char e)
{
switch(e)
	{
	case '+':q+=w;break;
	case '-':q-=w;break;
	case '*':q*=w;break;
	case '/':q/=w;break;
	}
}
int main()
{
f>>a;
n=strlen(a);
for(i=0;i<n;i++)
	if(a[i]>='0' && a[i]<='9')
		{
		x[vx++]=numar(i);
		}
	else
		if(a[i]=='(' )
			b[vb++]=a[i];
		else
			if(a[i]==')')
			    {
			    while(b[vb-1]!='(')
			    {
			     efectueaza(x[vx-2],x[vx-1],b[vb-1]);
			     vx--;vb--;
			    }
			    vb--;
			    }
			else
				{
				po=pri(a[i]);
				if(vb>0)
					ps=pri(b[vb-1]);
				else
					ps=-5;
				while(po<=ps)
				{
				 efectueaza(x[vx-2],x[vx-1],b[vb-1]);
				 vx--;vb--;
				 if(vb>0)
					ps=pri(b[vb-1]);
				 else
					ps=-5;
				}
				b[vb++]=a[i];
				}

while(vb>0)
	{
	efectueaza(x[vx-2],x[vx-1],b[vb-1]);
	vx--;vb--;
	}
g<<x[0]<<'\n';
g.close();
return 0;
}