Pagini recente » Cod sursa (job #444326) | Cod sursa (job #2007287) | Cod sursa (job #1548148) | Cod sursa (job #2534824) | Cod sursa (job #3149764)
//
// Created by mihai145 on 12.09.2023.
//
#include <fstream>
#include <string>
#include <stack>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
int main() {
string s;
cin >> s;
stack<int> vals;
stack<char> symbols;
auto precedence = [](char c) {
if (c == '+' || c == '-') return 1;
if (c == '*' || c == '/') return 2;
return 0;
};
auto perform_op = [&]() {
char c = symbols.top();
symbols.pop();
int v2 = vals.top();
vals.pop();
int v1 = vals.top();
vals.pop();
switch (c) {
case '+':
v1 += v2;
break;
case '-':
v1 -= v2;
break;
case '*':
v1 *= v2;
break;
case '/':
v1 /= v2;
break;
default:
break;
}
vals.push(v1);
};
for (int i = 0; i < (int) s.size(); i++) {
if (!isdigit(s[i])) {
if (s[i] == '(') {
symbols.push('(');
continue;
}
if (s[i] == ')') {
while (symbols.top() != '(') {
perform_op();
}
symbols.pop();
continue;
}
while ((int) symbols.size() > 0 && precedence(symbols.top()) >= precedence(s[i])) {
perform_op();
}
symbols.push(s[i]);
} else {
int val = 0;
while (i < (int) s.size() && isdigit(s[i])) {
val = val * 10 + s[i] - '0';
i++;
}
i--; // we overshoot by 1
vals.push(val);
}
}
while ((int) vals.size() > 1) {
perform_op();
}
cout << vals.top() << '\n';
return 0;
}