Cod sursa(job #559182)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 17 martie 2011 17:44:21
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include <fstream.h>
#include <cstring>

char c[100003],cNormalizat[100003],coada[100003],cPolonez[100003];
int n,k,nr[100003],nNormalizat,lungimeCoada,lungimePolonez,lungimeExpresie,expresie[100003];

ifstream fi("evaluare.in");
ofstream fo("evaluare.out");

void citire(){
	fi.get(c,100002,'\n');
	fi.close();
}

void normalizare(){
	int a,b,i;
	k=0;
	for(i=1;i<=n;i++)
		if(c[i]>='0' && c[i]<='9'){
			k++;
			a=c[i]-'0';
			b=a;
			i++;
			while(c[i]>='0' && c[i]<='9' && i<=n){
				a=c[i]-'0';
				b=b*10+a;
				i++;
			}
			nr[k]=b;
		}
	nNormalizat=0;
	k=0;
	for(i=1;i<=n;i++){
		nNormalizat++;
		if(c[i]>='0' && c[i]<='9'){
			while(c[i]>='0' && c[i]<='9'){
				i++;
			}
			i--;
			cNormalizat[nNormalizat]='n';
		}
		else cNormalizat[nNormalizat]=c[i];
	}
	lungimeCoada=0;
	lungimePolonez=0;
	for(i=1;i<=nNormalizat;i++){
		if(cNormalizat[i]==')'){
			while(coada[lungimeCoada]!='('){
				lungimePolonez++;
				cPolonez[lungimePolonez]=coada[lungimeCoada];
				lungimeCoada--;
			}
			lungimeCoada--;
		}
		else if(cNormalizat[i]=='n'){
			lungimePolonez++;
			cPolonez[lungimePolonez]=cNormalizat[i];
		}
		else {
			if((cNormalizat[i]=='+' || cNormalizat[i]=='-')&& (coada[lungimeCoada]=='*' || coada[lungimeCoada]=='/')){
				while(coada[lungimeCoada]=='*' || coada[lungimeCoada]=='/'){
					lungimePolonez++;
					cPolonez[lungimePolonez]=coada[lungimeCoada];
					lungimeCoada--;
				}
				lungimeCoada++;
				coada[lungimeCoada]=cNormalizat[i];
			}
			else{
				lungimeCoada++;
				coada[lungimeCoada]=cNormalizat[i];
			}
		}
	}
	while(lungimeCoada!=0){
		lungimePolonez++;
		cPolonez[lungimePolonez]=coada[lungimeCoada];
		lungimeCoada--;
	}
	k=0;
	for(i=1;i<=lungimePolonez;i++){
		if(cPolonez[i]=='n'){
			k++;
			lungimeExpresie++;
			expresie[lungimeExpresie]=nr[k];
		}
		else if(cPolonez[i]=='*'){
			expresie[lungimeExpresie-1]*=expresie[lungimeExpresie];
			lungimeExpresie--;
		}
		else if(cPolonez[i]=='/'){
			expresie[lungimeExpresie-1]/=expresie[lungimeExpresie];
			lungimeExpresie--;
		}
		else if(cPolonez[i]=='+'){
			expresie[lungimeExpresie-1]+=expresie[lungimeExpresie];
			lungimeExpresie--;
		}
		else if(cPolonez[i]=='-'){
			expresie[lungimeExpresie-1]-=expresie[lungimeExpresie];
			lungimeExpresie--;
		}
	}
}

void rezolvare(){
	int i;
	n=strlen(c);
	for(i=n;i>=1;i--)
		c[i]=c[i-1];
	c[n+1]='\0';
	normalizare();
}

void afisare(){
	fo<<expresie[1]<<'\n';
	fo.close();
}

int main(){
	citire();
	rezolvare();
	afisare();
	return 0;
}