Cod sursa(job #475932)

Utilizator petroMilut Petronela petro Data 9 august 2010 12:55:26
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.51 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 100010

FILE *f=fopen("evaluare.in","r");
FILE *g=fopen("evaluare.out","w");

char exp[M],s[M];

void solve()
{
	char *cuv;
	int st[M],vf=0;
	
	cuv=strtok(s," ");
	while(cuv)
	{
		if(cuv[0]>='0' && cuv[0]<='9') st[++vf]=atoi(cuv);
		else if(cuv[0]=='+') {st[vf-1]=st[vf-1]+st[vf];
							  --vf;}
			 else if(cuv[0]=='-') {st[vf-1]=st[vf-1]-st[vf];
								   --vf;}
				  else if(cuv[0]=='*') {st[vf-1]=st[vf-1]*st[vf];
										--vf;}
				       else if(cuv[0]=='/') {st[vf-1]=st[vf-1]/st[vf];
										     --vf;}
		cuv=strtok(NULL," ");
	}
	
	fprintf(g,"%ld\n",st[1]);
	fclose(g);
}

void rpn()
{
	fgets(exp,M,f);
	char v[M];
	int q=-1,k=-1,i;
	
	for(i=0;i<=strlen(exp)-1;++i)
		if(exp[i]=='(') v[++k]=exp[i];
		else if(exp[i]==')') {while(v[k]!='(')
							  {
								  s[++q]=' ';
								  s[++q]=v[k];
								  --k;
							  }
							  s[++q]=' ';
							  --k;}
		     else if(exp[i]>='0' && exp[i]<='9') s[++q]=exp[i];
			      else if(exp[i]=='+' || exp[i]=='-') { if(k==-1 || v[k]=='(') {v[++k]=exp[i];
																			    s[++q]=' ';}
													    else if(v[k]=='+' || v[k]=='-') {s[++q]=' ';
																					     s[++q]=v[k];
																						 s[++q]=' ';
																						 v[k]=exp[i];}
														    else if(v[k]=='*' || v[k]=='/') {if(k==0 || v[k-1]=='(') {s[++q]=' ';
																													  s[++q]=v[k];
																													  s[++q]=' ';
																													  v[k]=exp[i];}
																							 else if(v[k-1]=='+' || v[k-1]=='-') {s[++q]=' ';
																																  s[++q]=v[k];
																																  s[++q]=' ';
																																  --k;
																																  s[++q]=v[k];
																																  s[++q]=' ';
																																  v[k]=exp[i];}
																							}
													   }
					   else if(exp[i]=='*' || exp[i]=='/') {if(k==-1 || v[k]=='(') {v[++k]=exp[i];
																				    s[++q]=' ';}
														    else if(v[k]=='+' || v[k]=='-') {v[++k]=exp[i];
																							s[++q]=' ';}
															     else if(v[k]=='*' || v[k]=='/') {s[++q]=' ';
																								  s[++q]=v[k];
																								  s[++q]=' ';
																								  v[k]=exp[i];}
														   }
					   
	while(k!=-1)
	{
		s[++q]=' ';
		s[++q]=v[k];
		--k;
	}
	s[++q]=NULL;
	fclose(f);				   
}

int main()
{
	rpn();
	solve();
	return 0;
}