Cod sursa(job #3216845)

Utilizator B0gd4n_Ciobanu Bogdan-Mihai B0gd4n_ Data 20 martie 2024 00:47:53
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

string s;

int get_num(int& i) {
	string num;
	while (isdigit(s[i])) {
		num.push_back(s[i]);
		++i;
	}
	--i;
	return stoi(num);
}

int compute(vector<int>& nums, vector<char>& ops) {
	for (int i = 0; i < ops.size(); ++i) {
		if (ops[i] == '*') {
			nums[i] *= nums[i + 1];
			nums.erase(nums.begin() + i + 1);
			ops.erase(ops.begin() + i);
			--i;
		}
		else if (ops[i] == '/') {
			nums[i] /= nums[i + 1];
			nums.erase(nums.begin() + i + 1);
			ops.erase(ops.begin() + i);
			--i;
		}
	}

	for (int i = 0; i < ops.size(); ++i) {
		if (ops[i] == '-') {
			nums[i + 1] *= -1;
		}
	}

	int sum = 0;
	for (auto num : nums) {
		sum += num;
	}

	return sum;
}

int calc(int& i) {
	vector<int> nums;
	vector<char> ops;

	while (i < s.size()) {
		if (s[i] == ')') {
			return compute(nums, ops);
		}
		else if (s[i] == '(') {
			++i;
			nums.push_back(calc(i));
		}
		else if (isdigit(s[i])) {
			nums.push_back(get_num(i));
		}
		else {
			ops.push_back(s[i]);
		}
		++i;
	}

	return compute(nums, ops);
}

int main()
{
	getline(fin, s);

	int i = 0;
	fout << calc(i);

	return 0;
}