Cod sursa(job #721731)

Utilizator RaduDoStochitoiu Radu RaduDo Data 24 martie 2012 00:27:38
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char e[100002],p[100002];
long long i,lg,l,k,nr;
struct {long long nr,v;} marime[100002];
void TransformExpresie();
void TransformTermen();
void TransformFactor();
long long Evalexp();
long long eval(char);
int main()
{
	freopen("evaluare.in","r",stdin);
	freopen("evaluare.out","w",stdout);
	gets(e);
	lg=strlen(e)-1;
	i=0;
	TransformExpresie();
	i=strlen(p)-1;
	printf("%ld\n",Evalexp());
	return 0;
	
}

void TransformFactor()
{
	if(e[i]=='(')
	{
		i++;
		TransformExpresie();
		i++;
	}
	else
	{
		l=strlen(p);
		if(e[i]>='0'&&e[i]<='9')
		{
			k++;nr=0;
			while(e[i]>='0'&&e[i]<='9')
			{
				nr=nr*10+int(e[i])-48;
				p[l]=e[i];
				p[l+1]='\0';
				i++;l=strlen(p);
				marime[k].nr++;
			}
			marime[k].v=nr;
		}
		else
		{
			p[l]=e[i];
			p[l+1]='\0';
			i++;
		}
	}
}
void TransformTermen()
{
	char ch;
	TransformFactor();
	while(i<=lg&&(e[i]=='*'||e[i]=='/'))
	{
		ch=e[i];i++;
		TransformFactor();
		if(ch=='*')
			strcat(p,"*");
		else
			strcat(p,"/");
	}
}
void TransformExpresie()
{
	char ch;
	TransformTermen();
	while(i<=lg&&(e[i]=='+'||e[i]=='-'))
	{
		ch=e[i];i++;
		TransformTermen();
		if(ch=='+')
			strcat(p,"+");
		else
			strcat(p,"-");
	}
}
long long eval(char c)
{
	k--;
	i-=marime[k+1].nr;
	return marime[k+1].v;
}
long long Evalexp()
{
	long long e1,e2;
	if(p[i]=='+')
	{
		i--;
		e1=Evalexp();
		e2=Evalexp();
		return e1+e2;
	}
	else
		if(p[i]=='-')
		{
			i--;
			e1=Evalexp();
			e2=Evalexp();
			return e2-e1;
		}
	else
		if(p[i]=='*')
		{
			i--;
			e1=Evalexp();
			e2=Evalexp();
			return e1*e2;
		}
	else
		if(p[i]=='/')
		{
			i--;
			e1=Evalexp();
			e2=Evalexp();
			return e2/e1;
		}
		else
		{
			return eval(p[i]);
		}
}