Cod sursa(job #659809)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 11 ianuarie 2012 00:19:26
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<fstream>
#include<cstring>
#define inf 2000000000
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

char s[100010],c;
int n,m,x[100010],p[100010],pc,k,nr[100010];

int putere(int a, int b)
{
	int put=1;
	for(int i=1;i<=b;i++)
		put*=a;
	return put;
}

void adaug(int i)
{
	if(k&&p[i]!=inf)
	{
		switch (s[i])
			{
			case '*': k-=2;x[k]=x[k]*x[k+1];k++;break;
			case '/': k-=2;x[k]=x[k]/x[k+1];k++;break;
			case '^': k-=2;x[k]=putere(x[k],x[k+1]);k++;break;
			case '+': k-=2;x[k]=x[k]+x[k+1];k++;break;
			case '-': k-=2;x[k]=x[k]-x[k+1];k++;break;
			}
	}
	else
		x[k++]=nr[i];
}

void divide(int i, int j)
{
	if(i==j)
	{	adaug(i);return;}
	int imin,minn=inf+1;
	for(int l=j;l>=i;l--)
		if(p[l]<minn)
		{
			minn=p[l];
			imin=l;
		}
	divide(i,imin-1);
	divide(imin+1,j);
	adaug(imin);
}
	
int main()
{
	f.get(s[n]);
	do
	{
		if(isdigit(s[n]))
		{
			p[m]=inf;
			if(isdigit(c))
				nr[m]=nr[m]*10+s[n]-'0';
			else 
				nr[m]=s[n]-'0';
			c=s[n];
			f.get(s[n]);
			if(!isdigit(s[n]))
			{	s[++n]=s[n-1];s[n-1]=c;m++;}
		}
		else
		{
			c=s[n];
			switch (s[n])
			{
			case '(': pc+=10;f.get(s[n]); break;
			case ')': pc-=10;f.get(s[n]);break;
			case '*': p[m++]=pc+2; f.get(s[++n]);break;
			case '/': p[m++]=pc+2; f.get(s[++n]);break;
			case '^': p[m++]=pc+3; f.get(s[++n]);break;
			case '+': p[m++]=pc+1; f.get(s[++n]);break;
			case '-': p[m++]=pc+1; f.get(s[++n]);break;
			}
			
		}
	} while(s[n]!='\n');
	divide(0,n-1);
	g<<x[0];
	g.close();
	f.close();
	return 0;
}