Cod sursa(job #682681)

Utilizator ivonaChili Ivona Alexandra ivona Data 19 februarie 2012 13:10:07
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int st[100001],v[100001],k=0,vf=0,st1[100001],vf1=0,i,m,a;
char s[100001];
int main()
{
	
	FILE *f=fopen("evaluare.in","r");
	FILE *g=fopen("evaluare.out","w");
	fscanf(f,"%s",&s);
	for(i=0;i<strlen(s);i++)
	{
		if(isdigit(s[i]))
		{
			m=0;
			while(isdigit(s[i]))
			{
				m=m*10+(s[i]-'0');
				i++;
			}
			i--;
			v[++k]=m;
		}
		if(s[i]=='(')st[++vf]=-5;
		if(s[i]=='+'||s[i]=='-')
		{
			if(st[vf]==-1||st[vf]==-4)
			{
				if(s[i]=='+')
				{
					if(st[vf]==-1)a=-1;
					else a=-4;
					while(st[vf]==a)
					{ 
						vf--;
						v[++k]=a;
						
					}
					vf++;
					st[vf]=-2;
				}
				else
				{
					if(st[vf]==-1)a=-1;
					else a=-4;
					while(st[vf]==a)
					{
						vf--;
						v[++k]=a;
						
					}
					vf++;
					st[vf]=-3;
				}
			}
			else
			{
				if(s[i]=='+')a=-2;
						else a=-3;
						st[++vf]=a;
			}
		}
		if(s[i]=='*')st[++vf]=-1;
		if(s[i]=='/')st[++vf]=-4;
		if(s[i]==')')
		{
			while(st[vf]!=-5)
			{
				v[++k]=st[vf];
				vf--;
			}
			vf--;
		}
	}
	for(i=vf;i>=1;i--)v[++k]=st[i];
	if(st[0]<0)v[++k]=st[i];
	for(i=1;i<=k;i++)
	{
		if(v[i]>=0)st1[++vf1]=v[i];
		else
		{
			if(v[i]==-1){m=st1[vf1]*st1[vf1-1];vf1--;st1[vf1]=m;}
			if(v[i]==-2){m=st1[vf1]+st1[vf1-1];vf1--;st1[vf1]=m;}
			if(v[i]==-3){m=st1[vf1-1]-st1[vf1];vf1--;st1[vf1]=m;}
			if(v[i]==-4){m=st1[vf1-1]/st1[vf1];vf1--;st1[vf1]=m;}
		}
	}
	fprintf(g,"%d",st1[vf1]);
	fclose(f);
	fclose(g);
}