Cod sursa(job #312912)

Utilizator irene_mFMI Irina Iancu irene_m Data 7 mai 2009 13:39:15
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
#define MaxN 1000009

char s[MaxN],a[MaxN][15],semn[MaxN];
int n,nr;
long st[MaxN];

void cit()
{
	ifstream fin("evaluare.in");
	fin.get(s,MaxN,'\n');
	fin.close();
	n=strlen(s);
}

void postfix()
{
	int i=0,j,nrs=1;
	char aux[15];
	semn[0]='#';
	while(i<n)
	{
		if((s[i]=='*' || s[i]=='/') && s[i]!=semn[nrs-1])
		{
			semn[nrs]=s[i];
			nrs++;
			i++;
		}
		else
			if(((s[i]=='*' || s[i]=='/') && (semn[nrs-1]=='*' || semn[nrs-1]=='/')) || ((s[i]=='+' || s[i]=='-') && (semn[nrs-1]=='+' || semn[nrs-1]=='-' || semn[nrs-1]=='*' || semn[nrs-1]=='/')))
			{
				while(((s[i]=='*' || s[i]=='/') && (semn[nrs-1]=='*' || semn[nrs-1]=='/')) || ((s[i]=='+' || s[i]=='-') && (semn[nrs-1]=='+' || semn[nrs-1]=='-' || semn[nrs-1]=='*' || semn[nrs-1]=='/')))
				{
					nrs=nrs-1;
					a[nr][0]=semn[nrs];
					a[nr][1]='\0';
					nrs--;
					nr++;
				}
				semn[nrs]=s[i];
				nrs++;
				i++;
			}
			else
				if((s[i]=='+' || s[i]=='-') && (semn[nrs-1]=='#' || semn[nrs-1]=='('))
				{
					semn[nrs]=s[i];
					nrs++;
					i++;
				}

		else
			if(s[i]=='(')
			{
				semn[nrs]=s[i];
				nrs++;
				i++;
			}
			else
				if(s[i]==')')
				{
					nrs=nrs-1;
					while(semn[nrs]!='(')
					{
						a[nr][0]=semn[nrs];
						a[nr][1]='\0';
						nr++;
						nrs--;
					}
					i++;
				}
				else
				{
					j=i;
					while(s[i]>='0' && s[i]<='9' && i<n)
						i++;
					strncpy(aux,s+j,i-j);
					aux[i-j]='\0';
					strcpy(a[nr],aux);
					nr++;
				}
	}
	nrs--;
	while(nrs>=0)
	{
		a[nr][0]=semn[nrs];
		a[nr][1]='\0';
		nrs--;
		nr++;
	}
}

void eval()
{
	int N=0,i;
	long aux;
	for(i=0;i<=nr;i++)
	{
		if(a[i][0]<='9' && a[i][0]>='0')
		{
			aux=atol(a[i]);
			N++;
			st[N]=aux;
		}
		else
		{
			switch(a[i][0]){
			case '+':
				aux=st[N]+st[N-1];
				N--;
				st[N]=aux;
				break;
			case '-':
				aux=st[N-1]-st[N];
				N--;
				st[N]=aux;
				break;
			case '*':
				aux=st[N-1]*st[N];
				N--;
				st[N]=aux;
				break;
			case '/':
				aux=st[N-1]/st[N];
				N--;
				st[N]=aux;
				break;
			}
		}
	}
}

void afis()
{
	int i;
	ofstream fout("evaluare.out");
	fout<<st[1];
	fout.close();
}

int main()
{
	cit();
	postfix();
	eval();
	afis();
	return 0;
}