Cod sursa(job #2986482)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 28 februarie 2023 17:47:43
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>
#include <cmath>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <unordered_map>
#include <cstring>
#include <algorithm>

#define NMAX 100003

using namespace std;


FILE* fin, * fout;

stack<char>op;
stack<int>num;
char expr[NMAX];

int prior(char ch)
{
	if (ch == '*' || ch == '/')
	{
		return 2;
	}
	if (ch == '(')
	{
		return 0;
	}
	return 1;
}

int calc(long long a, long long b, char ch)
{
	if (ch == '+')
	{
		return a + b;
	}
	if (ch == '-')
	{
		return a - b;
	}
	if (ch == '*')
	{
		return a * b;
	}
	return a / b;
}

int main()
{
	fin = fopen("evaluare.in", "r");
	fout = fopen("evaluare.out", "w");

	fgets(expr,NMAX,fin);
	int n = strlen(expr);
	for (int i = 0; i < n; i++)
	{
		if (expr[i] >= '0' && expr[i] <= '9')
		{
			//e numar
			int nr = 0;
			while (i < n && expr[i] >= '0' && expr[i] <= '9')
			{
				nr = nr * 10 + expr[i] - '0';
				i++;
			}
			if (i < n)
			{
				i--;
			}
			num.push(nr);
		}
		else {
			//am operator
			char oper = expr[i];
			if (oper == '(')
			{
				//adaug in stiva
				op.push(oper);
			}
			else if (oper == ')')
			{
				//rezolv ec pana cand dau de '('
				while (!op.empty() && op.top()!='(')
				{
					char ex = op.top();
					int nrTop = num.top();
					num.pop();
					int rez = calc(num.top(), nrTop, ex);
					num.pop();
					num.push(rez);
					op.pop();

				}
				op.pop();
			}
			else {
				while (!op.empty() && prior(oper) <= prior(op.top()))
				{
					char ex = op.top();
					int nrTop = num.top();
					num.pop();
					int rez = calc(num.top(), nrTop, ex);
					num.pop();
					num.push(rez);
					op.pop();

				}
				op.push(oper);
			}
			
		}
	}
	while (!op.empty())
	{
		char ex = op.top();
		int nrTop = num.top();
		num.pop();
		int rez = calc(num.top(), nrTop, ex);
		num.pop();
		num.push(rez);
		op.pop();

	}
	fprintf(fout,"%d", num.top());
	return 0;
}