Cod sursa(job #2342704)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 13 februarie 2019 11:26:25
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
long long op[100001],q[100001],n,i,nr,nr2,x;
char s[100001];
int grad(char c)
{
	if(c=='+' or c=='-')
	{
		return 1;
	}
	if(c=='*' or c=='/')
	{
		return 2;
	}
	return 0;
}
void calculeaza(int a,int b)
{
	if(op[b]=='+')
	{
		q[a-1]+=q[a];
	}
	if(op[b]=='-')
	{
		q[a-1]-=q[a];
	}
	if(op[b]=='*')
	{
		q[a-1]*=q[a];
	}
	if(op[b]=='/')
	{
		q[a-1]/=q[a];
	}
	return;

}
int main()
{
	f.getline(s,100001);
	n=strlen(s);
	for(i=0; i<n; i++)
	{
		if(isdigit(s[i]))
		{
			x=0;
			while(isdigit(s[i]))
			{
				x*=10;
				x+=s[i]-'0';
				i++;
			}
			i--;
			q[++nr]=x;
		}
		else
		{
			if(nr2==0 || s[i]=='(' || grad(op[nr2])<grad(s[i]))
			{
				op[++nr2]=s[i];
			}
			else if(s[i]==')')
			{
				while(op[nr2]!='(')
				{
					calculeaza(nr,nr2);
					nr--;
					nr2--;
				}
				nr2--;
			}
			else
			{
				while(grad(s[i])<=grad(op[nr2]))
				{
					calculeaza(nr,nr2);
					nr--;
					nr2--;
				}
				op[++nr2]=s[i];
			}
		}
	}
	while(nr2)
	{
		calculeaza(nr,nr2);
		nr--;
		nr2--;
	}
	g<<q[1];
	return 0;
}