Cod sursa(job #3208986)

Utilizator BOSSSTEFANPetrescu Ioan Stefan BOSSSTEFAN Data 1 martie 2024 17:33:52
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
long long st1[100001];
int st2[100001];
char sir[100001];
long long calc(long long a, long long 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=0,k2=0,nr=0,ok=0;
	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;
				///cout<<nr<<" ";
				st1[++k1]=nr;
				nr=0;
			}
			if(sir[i]=='(')
				st2[++k2]=0;
			else
			if(sir[i]==')')
			{
				while(st2[k2]<0)
				{
				  ///  cout<<st2[k2]<<" ";
					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]<0)
				{
				    ///cout<<st2[k2]<<" ";
					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
			{
			    while(k2>0&&(st2[k2]==-1||st2[k2]==-2))
				{
				    ///cout<<st2[k2]<<" ";
					st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
					k1--;
					k2--;
				}
				if(sir[i]=='*')
					st2[++k2]=-1;
				else
					st2[++k2]=-2;
			}
		}
	}
	if(ok==1)
    {
       /// cout<<nr<<" ";
		st1[++k1]=nr;
    }
	while(k2>0)
	{
	   /// cout<<st2[k2]<<" ";
		st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
		k1--;
		k2--;
	}
	cout<<st1[1];
    return 0;
}