Cod sursa(job #883013)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 19 februarie 2013 17:33:20
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<fstream>
#include<cstring>
using namespace std;

const int MAXN=100001;
const char* INFILE="evaluare.in";
const char* OUTFILE="evaluare.out";
int lgs,lgp,vf=-1,vfrez=-1;
char s[MAXN];
char p[MAXN];
char st[MAXN];
long rez[MAXN];

void push(char x)
{
	vf++;
	st[vf]=x;
}
char pop()
{
	char aux=st[vf];
	st[vf]=0;
	vf--;
	return aux;
}
void citire()
{
	ifstream fin(INFILE);
	fin.getline(s,MAXN);
	lgs=strlen(s);
	fin.close();
}
int prioritate(char c)
{
	switch (c)
	{
		case '(':
			return 3;
		case '*':
			return 2;
		case '/':
			return 2;
		case '+':
			return 1;
		case '-':
			return 1;
		case ')':
			return 0;
		default:
			return -1;
	}
}
void convert()
{
	int i=0,nr;
	for(i=0;i<lgs;i++)
	{
		if (s[i]>='0' && s[i]<='9')
		{
			nr=0;
			while (s[i]>='0' && s[i]<='9')
			{
				nr=nr*10-s[i]+'0';
				i++;
			}
			p[lgp++]=nr;
			i--;
		}
		else
		{
			if (vf==-1)
				push(s[i]);
			else
			{
				if (s[i]==')')
				{
					while (st[vf]!='(')
					{
						p[lgp++]=pop();
					}
					pop();
				}
				else if (prioritate(st[vf])>=prioritate(s[i]) && st[vf]!='(')
				{
					p[lgp++]=pop();
					push(s[i]);
				}
				else
					push(s[i]);
			}
		}
	}
	while (vf!=-1)
		p[lgp++]=pop();
}
long expresie (int x,int y,char op)
{
	switch (op)
	{
		case '+':
			return x+y;
		case '-':
			return x-y;
		case '*':
			return x*y;
		case '/':
			return x/y;
	}
}
void rezolva()
{
	//if (p[0]<=0)
	int i=0;
	for (i=0;i<lgp;i++)
	{
		if (p[i]<0)
		{
			rez[++vfrez]=0-p[i];
		}
		else
		{
			rez[vfrez-1]=expresie(rez[vfrez-1],rez[vfrez],p[i]);
			rez[vfrez]=0;
			vfrez--;
		}
	}

}
void afisare()
{
	ofstream fout(OUTFILE);
	fout<<rez[0];
	fout.close();
}
int main()
{
	citire();
	convert();
	rezolva();
	afisare();
	return 0;
}