Cod sursa(job #3315242)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 13 octombrie 2025 10:21:39
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=100'005;
constexpr ll MOD=1'000'000'007;

char s[NMAX];

int eval(int a, char op, int b)
{
	if(op=='+')
		return a+b;
	if(op=='-')
		return a-b;
	if(op=='/')
		return a/b;
	return a*b;
}

int eval()
{
	int i, x, a, b;
	std::vector<int> st;
	std::vector<char> ops;

	for(i=0;i<NMAX && s[i] && s[i]!='\n';++i)
	{
		if(s[i]>='0' && s[i]<='9')
		{
			x=0;
			while(s[i]>='0' && s[i]<='9')
				x=x*10+s[i++]-'0';
			--i;
			st.push_back(x);
		}
		else if(s[i]=='(')
			ops.push_back('(');
		else if(s[i]==')')
		{
			while(ops.back()!='(')
			{
				b=st.back();
				st.pop_back();
				a=st.back();
				st.pop_back();
				st.push_back(eval(a, ops.back(), b));
				ops.pop_back();
			}
			ops.pop_back();
		}
		else if(s[i]=='+' || s[i]=='-')
		{
			while(!ops.empty() && ops.back()!='(')
			{
				b=st.back();
				st.pop_back();
				a=st.back();
				st.pop_back();
				st.push_back(eval(a, ops.back(), b));
				ops.pop_back();
			}
			ops.push_back(s[i]);
		}
		else
		{
			while(!ops.empty() && (ops.back()=='*' || ops.back()=='/'))
			{
				b=st.back();
				st.pop_back();
				a=st.back();
				st.pop_back();
				st.push_back(eval(a, ops.back(), b));
				ops.pop_back();
			}
			ops.push_back(s[i]);
		}
	}

	while(!ops.empty())
	{
		b=st.back();
		st.pop_back();
		a=st.back();
		st.pop_back();
		st.push_back(eval(a, ops.back(), b));
		ops.pop_back();
	}

	return st[0];
}

int main()
{
	FILE* f=fopen("evaluare.in", "r"), *g=fopen("evaluare.out", "w");

	fgets(s, NMAX, f);
	fprintf(g, "%d\n", eval());

	fclose(f);
	fclose(g);
	return 0;
}