Cod sursa(job #567314)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 29 martie 2011 22:16:47
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
using namespace std;
char v[100001],st[100001],expr[100001];
long y[100001];
int vf,nr;
void rezultat()
{int i,k=0,m=-1;
for(i=0;expr[i];i++)
	{k=0;
	if(isdigit(expr[i]))
	{while(isdigit(expr[i]))
		v[k]=expr[i],k++,i++;
	v[k]=0,k++;
	y[++m]=atoi(v);
	}
	else
	switch(expr[i])
	{case '+': y[m-1]=y[m-1]+y[m--];break;
	case '-': y[m-1]=y[m-1]-y[m--];break;
	case '*': y[m-1]=y[m-1]*y[m--];break;
	case '/': y[m-1]=y[m-1]/y[m--];break;
	}
	}
}
char pop()
{if(nr>=1) {nr--;return st[nr];}
return 0;
}
void push(char c)
{st[nr]=c;nr++;
}
void evaluare()
{int i,n;
char c;
n=strlen(v);
for(i=0;v[i];i++)
	{if(isdigit(v[i])) {
	while(isdigit(v[i]))
			{expr[vf]=v[i];
			vf++,i++;
			}
	expr[vf]='.',vf++;}
	switch(v[i])
	{case '(':push(v[i]);break;
	case ')':while((c=pop())!='(') expr[vf++]=c;break;
	case '/':
	case '*':if(strchr("(+-",st[nr-1])||(nr==0)) push(v[i]);
			else
			if(strchr("*/",st[nr-1])){expr[nr]=pop();nr++;i--;}break;
	case '+':
	case '-':if(st[nr-1]=='('||nr==0) push(v[i]);
			else expr[vf]=pop(),vf++,i--;break;
	}
	}
while((c=pop())!=0) expr[vf]=c,vf++;
expr[vf]=0,vf++;
}
int main()
{
ifstream in("evaluare.in");
in.get(v,100000);
in.close();
evaluare();
rezultat();
ofstream out("evaluare.out");
out<<y[0]<<'\n';
out.close();
return 0;	
}