Pagini recente » Cod sursa (job #2317615) | Cod sursa (job #2654343) | Cod sursa (job #312602) | Cod sursa (job #29854) | Cod sursa (job #3178282)
#include <fstream>
#include <string>
#include <vector>
#include <cassert>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
int main()
{
string exp;
cin >> exp;
int n = (int)exp.size();
vector<int> values;
vector<char> symbols;
auto perform_operation = [&]()
{
char symbol = symbols.back();
symbols.pop_back();
int v2 = values.back();
values.pop_back();
int v1 = values.back();
values.pop_back();
switch (symbol)
{
case '+':
v1 += v2;
break;
case '-':
v1 -= v2;
break;
case '*':
v1 *= v2;
break;
case '/':
v1 /= v2;
break;
default:
break;
}
values.push_back(v1);
};
auto precedence = [](char c)
{
if (c == '+' || c == '-')
return 0;
if (c == '*' || c == '/')
return 1;
if (c == '(')
return -1;
assert(false);
};
for (int i = 0; i < n; i++)
{
if (isdigit(exp[i]))
{
int number = 0;
while (i < n && isdigit(exp[i]))
{
number = number * 10 + (exp[i] - '0');
i++;
}
values.push_back(number);
i--; // overshoot by one, the for loop increments as well
}
else
{
if (exp[i] == '(')
{
symbols.push_back(exp[i]);
}
else if (exp[i] == ')')
{
while (symbols.back() != '(')
perform_operation();
symbols.pop_back();
}
else
{
// Stop if we encounter '(' (has lowest precedence)
// Or if we have a + or - and we encounter a * or /
while (symbols.size() > 0 && precedence(exp[i]) <= precedence(symbols.back()))
perform_operation();
symbols.push_back(exp[i]);
}
}
}
while (symbols.size() > 0)
perform_operation();
cout << values[0] << '\n';
return 0;
}