Cod sursa(job #3203012)

Utilizator laurentiu.maticaMatica Laurentiu-Andrei laurentiu.matica Data 12 februarie 2024 21:21:26
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
// #include <iostream>

#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 b / a;
	default:
		break;
	}
}
int priority(char a, char b)
{
	if (a == '(')
		return 2;
	if (a == '-' || a == '+' && b == '*' || b == '/')
		return 2;
	else return 1;
}
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() != '(')
				{
					int num1 = nr.top();
					nr.pop();
					int num2 = 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]) == 2)
					op.push(a[i++]);
				else
				{
					do
					{
						int num1 = nr.top();
						nr.pop();
						int num2 = nr.top();
						nr.pop();
						char c = op.top();
						op.pop();
						nr.push(eval(num1, num2, c));
					} while (!op.empty() && priority(op.top(), a[i]) == 1);
					op.push(a[i++]);
				}
				break;
			}
			default:nr.push(nextNum());
		}
	}
	while (!op.empty())
	{
		int num1 = nr.top();
		nr.pop();
		int num2 = nr.top();
		nr.pop();
		char c = op.top();
		op.pop();
		nr.push(eval(num1, num2, c));
	}
	cout << nr.top();
	return 0;
}