Cod sursa(job #683155)

Utilizator ivonaChili Ivona Alexandra ivona Data 20 februarie 2012 08:43:33
Problema Evaluarea unei expresii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 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]=='-')
		{
			while(st[vf]==-1||st[vf]==-4||st[vf]==-2||st[vf]==-3)
			{
				v[++k]=st[vf];
				vf--;
			}
			vf++;
			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);
}