Cod sursa(job #401087)

Utilizator BooZZySandu Bogdan BooZZy Data 22 februarie 2010 13:33:23
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include<stdio.h>
#include<string.h>
char v[100001],s1[1000];
long long int k,x,aux,n,i,t,j,ok;
struct nod
{
	long long int inf,clc;
	nod *nxt,*ant;
};
nod *s2,*s3,*c,*p,*u,*c3,*p3,*u3;
long long int op(long long int a,long long int b,long long int s)
{
	if(s==3)return a+b;
	if(s==4)return a-b;
	if(s==1)return a*b;
	if(s==2)return a/b;
	return 0;
}
int main()
{
	freopen("evaluare.in","r",stdin);
	freopen("evaluare.out","w",stdout);
	scanf("%s",&v);
	n=strlen(v)+1;
	c=new nod;
	c->inf=0;
	c->clc=0;
	c->nxt=NULL;
	c->ant=NULL;
	p=u=c;
	for(i=0;i<n;i++)
	{
		if(v[i]>='0'&&v[i]<='9')
		{
			aux=0;
			while(v[i]>='0'&&v[i]<='9')
			{
				aux=aux*10+v[i]-48;
				i++;
			}
			i--;
			c=new nod;
			c->inf=aux;
			c->clc=0;
			u->nxt=c;
			c->ant=u;
			c->nxt=NULL;
			u=c;
		}
		else if(v[i]=='(')
				s1[++x]=v[i];
		else if(v[i]=='+'||v[i]=='-')
				if(x>0&&s1[x]!='(')
				{
					while(x>0&&s1[x]!='(')
					{
						c=new nod;
						u->nxt=c;
						c->ant=u;
						c->nxt=NULL;
						u=c;
						if(s1[x]=='*')
							c->clc=1,c->inf=0;
						if(s1[x]=='/')
							c->clc=2,c->inf=0;
						if(s1[x]=='+')
							c->clc=3,c->inf=0;
						if(s1[x]=='-')
							c->clc=4,c->inf=0;
						s1[x]='\0';
						x--;
					}
					x++;
					s1[x]=v[i];
				}
				else s1[++x]=v[i];
		else if(v[i]=='*'||v[i]=='/')
				s1[++x]=v[i];
		else if(v[i]==')')
		{
			while(s1[x]!='(')
			{
				c=new nod;
				u->nxt=c;
				c->ant=u;
				c->nxt=NULL;
				u=c;
				if(s1[x]=='*')
					c->clc=1,c->inf=0;
				if(s1[x]=='/')
					c->clc=2,c->inf=0;
				if(s1[x]=='+')
					c->clc=3,c->inf=0;
				if(s1[x]=='-')
					c->clc=4,c->inf=0;
				s1[x]='\0';
				x--;
			}
			s1[x]='\0';
			x--;
		}
	}
	while(x>0)
	{
		c=new nod;
		u->nxt=c;
		c->ant=u;
		c->nxt=NULL;
		u=c;
		if(s1[x]=='*')
			c->clc=1,c->inf=0;
		if(s1[x]=='/')
			c->clc=2,c->inf=0;
		if(s1[x]=='+')
			c->clc=3,c->inf=0;
		if(s1[x]=='-')
			c->clc=4,c->inf=0;
		x--;
	}
	p=p->nxt;
	ok=1;
	while(ok)
	{
		c=p->nxt->nxt;
		ok=1;
		while(c)
		{
			if(c->clc!=0)
				if(c->ant->clc==0&&c->ant->ant->clc==0)
				{
					aux=op(c->ant->ant->inf,c->ant->inf,c->clc);
					p3=c->ant->ant;
					p3->nxt=c->nxt;
					if(c->nxt)c->nxt->ant=p3;
					else u=c;
					c=p3;
					c->inf=aux;
					ok=0;
				}
			c=c->nxt;
		}
	}
	printf("%d",p->inf);
	return 0;
}