Cod sursa(job #872698)

Utilizator Kira96Denis Mita Kira96 Data 6 februarie 2013 15:13:26
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include<string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
int gr(char t)
{
	if(t=='-'||t=='+')
	return 1;
	else
	if(t=='/'||t=='*')
	return 2;
	else
	return 0;
}
int n,t,i,nr,v[100100],k,sk,ts,stiva[100100];
char s[100100],op[100100],s1[100100];
int main ()
{
	f>>s;
	n=strlen(s);
	s1[1]='(';
	s[n]=')';
	for(i=0;i<=n;++i)
	{
		if(s[i]=='(')
			s1[++sk]='(';
			else
		if(s[i]>='0'&&s[i]<='9')
		{
			nr=0;
			while(s[i]>='0'&&s[i]<='9')
			{
				nr=nr*10+s[i]-48;
				i++;
			}
			--i;
			v[++t]=nr;
		}
		else
		if(s[i]==')')
		{
			for(k=sk;k>=0&&s1[k]!='(';--k)
			{
				op[++t]=s1[k];
			}
			sk=k-1;
		}
		else
		{
			if(gr(s[i])<=gr(s1[sk]))
			{
				op[++t]=s1[sk];
				s1[sk]=s[i];
			}
			else
			s1[++sk]=s[i];
		}
	}
	for(i=1;i<=t;++i)
	{
		if(v[i])
		{
			stiva[++ts]=v[i];
		}
		else
		{
			switch(op[i])
			{
				case '+': stiva[ts-1]=stiva[ts]+stiva[--ts]; break;
				case '-': stiva[ts-1]=stiva[--ts]-stiva[ts+1]; break;
				case '/': stiva[ts-1]=stiva[--ts]/stiva[ts+1]; break;
				case '*': stiva[ts-1]=stiva[ts]*stiva[--ts]; break;
			}
		}
	}
	g<<stiva[1];
}