Cod sursa(job #3208709)

Utilizator BOSSSTEFANPetrescu Ioan Stefan BOSSSTEFAN Data 29 februarie 2024 13:47:34
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
double st1[100001];
int st2[100001];
char sir[100001];
double calc(double a, double b, int c)
{
	if(c==-1)
		return a*b;
	else
	if(c==-2)
		return a/b;
	else
	if(c==-3)
		return a+b;
	else
		return a-b;
}
int main()
{
	cin>>sir;
	int n=strlen(sir),i,k1,k2=k1=0,nr=0,ok;
	for(i=0;i<n;i++)
	{
		if(sir[i]>='0'&&sir[i]<='9')
		{
			ok=1;
			nr=nr*10+sir[i]-'0';
		}
		else
		{
			if(ok==1)
			{
				ok=0;
				st1[++k1]=nr;
				nr=0;
			}
			if(sir[i]=='(')
				st2[++k2]=0;
			else
			if(sir[i]==')')
			{
				while(st2[k2]<0)
				{
					st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
					k1--;
					k2--;
				}
				k2--;
			}
			else
			if(sir[i]=='+'||sir[i]=='-')
			{
				while(k2>0&&(st2[k2]==-1||st2[k2]==-2))
				{
					st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
					k1--;
					k2--;
				}
				k2++;
				if(sir[i]=='+')
					st2[k2]=-3;
				else
					st2[k2]=-4;
			}
			else
			{
				if(sir[i]=='*')
					st2[++k2]=-1;
				else
					st2[++k2]=-2;
			}
		}
	}
	if(ok==1)
		st1[++k1]=nr;
	while(k2>0)
	{
		st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
		k1--;
		k2--;
	}
	cout<<st1[1];
    return 0;
}