Cod sursa(job #3203021)

Utilizator laurentiu.maticaMatica Laurentiu-Andrei laurentiu.matica Data 12 februarie 2024 22:00:26
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <string>
#include <stack>

using namespace std;

ifstream cin("evaluare.in");
ofstream cout("evaluare.out");

string a;
int i, n;
stack<long long>nr;
stack<char>op;

long long eval(long long a, long long b, char op)
{
	switch (op)
	{
	case'+':return a + b;
	case'-':return a - b;
	case'*':return a * b;
	case '/':return a / b;
	default:
		break;
	}
}
int priority(char a, char b)
{
	if (a == '(')
		return 1;
	if ((a == '-' || a == '+') && (b == '*' || b == '/'))
		return 1;
	return 0;
}
long long nextNum()
{
	long long num = 0;
	while (a[i] >= '0' && a[i] <= '9' && i < n)
		num = num * 10LL + (a[i++] - '0');
	return num;
}
int main()
{
	getline(cin, a);
	n = a.size();
	while (i < n)
	{
		switch (a[i])
		{
		case'(':
		{
			op.push(a[i++]);
			break;
		}
		case')':
		{
			while (op.top() != '(')
			{
				long long num2 = nr.top();
				nr.pop();
				long long num1 = nr.top();
				nr.pop();
				char c = op.top();
				op.pop();
				nr.push(eval(num1, num2, c));
			}
			op.pop();
			i++;
			break;
		}
		case'+':
		case'-':
		case'/':
		case'*':
		{
			if (op.empty() || priority(op.top(), a[i]) == 1)
				op.push(a[i++]);
			else
			{
				do
				{
					long long num2 = nr.top();
					nr.pop();
					long long num1 = nr.top();
					nr.pop();
					char c = op.top();
					op.pop();
					nr.push(eval(num1, num2, c));
				} while (!op.empty() && priority(op.top(), a[i]) == 0);
				op.push(a[i++]);
			}
			break;
		}
		default: {nr.push(nextNum()); break; }
		}
	}
	while (!op.empty())
	{
		long long num2 = nr.top();
		nr.pop();
		long long num1 = nr.top();
		nr.pop();
		char c = op.top();
		op.pop();
		nr.push(eval(num1, num2, c));
	}
	cout << nr.top();
	return 0;
}