Cod sursa(job #2986488)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 28 februarie 2023 17:53:15
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 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;

int nivOp, nivNum;
char op[NMAX];
int num[NMAX];
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[++nivNum]=nr;
		}
		else {
			//am operator
			char oper = expr[i];
			if (oper == '(')
			{
				//adaug in stiva
				op[++nivOp]=oper;
			}
			else if (oper == ')')
			{
				//rezolv ec pana cand dau de '('
				while (nivOp>0 && op[nivOp]!='(')
				{
					char ex = op[nivOp];
					int nrTop = num[nivNum--];
	
					int rez = calc(num[nivNum], nrTop, ex);

					num[nivNum]=rez;
					nivOp--;

				}
				nivOp--;
			}
			else {
				while (nivOp > 0 && prior(oper) <= prior(op[nivOp]))
				{
					char ex = op[nivOp];
					int nrTop = num[nivNum--];

					int rez = calc(num[nivNum], nrTop, ex);

					num[nivNum] = rez;
					nivOp--;

				}
				op[++nivOp]=oper;
			}
			
		}
	}
	while (nivOp > 0)
	{
		char ex = op[nivOp];
		int nrTop = num[nivNum--];

		int rez = calc(num[nivNum], nrTop, ex);

		num[nivNum] = rez;
		nivOp--;

	}
	fprintf(fout,"%d", num[1]);
	return 0;
}