Cod sursa(job #567329)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 29 martie 2011 22:25:04
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
using namespace std;
char v[100101],st[100101],expr[100101];
long y[100101];
int vf,nr=-1;
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>=0) return st[nr--];
return 0;
}
void push(char c)
{st[++nr]=c;
}
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])||(nr==-1)) push(v[i]);
			else
			if(strchr("*/",st[nr])){expr[nr]=pop();nr++;i--;}break;
	case '+':
	case '-':if(st[nr]=='('||nr==-1) 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;	
}