Pagini recente » Cod sursa (job #664649) | Cod sursa (job #2702920) | Cod sursa (job #1785744) | Cod sursa (job #2599748) | Cod sursa (job #2279004)
#include <fstream>
#include <cctype>
#include <string>
#include <stack>
#include <vector>
std::fstream fi("evaluare.in", std::ios::in);
std::fstream fo("evaluare.out", std::ios::out);
static short prioritate(char op) {
if (op == '+' || op == '-')
return 1;
if (op == '*' || op == '/')
return 2;
return 0;
}
static long long rezolva(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
return 0;
}
static long long evaluare(std::string tok) {
std::vector<long long> val;
std::vector<char> op;
for (unsigned i = 0; i < tok.length(); ++i) {
if (tok.at(i) == ' ')
continue;
else if (tok.at(i) == '(')
op.push_back(tok.at(i));
else if (std::isdigit(tok.at(i))) {
long long v = 0;
while (i < tok.length() && std::isdigit(tok.at(i)))
v = (v * 10) + (tok.at(i++) - 48);
if (i < tok.length())
if (!isdigit(tok.at(i)) && tok.at(i) != ' ') --i;
val.push_back(v);
}
else if (tok.at(i) == ')') {
while (!op.empty() && op.back() != '(') {
long long b = val.back(); val.pop_back();
long long a = val.back(); val.pop_back();
char o = op.back(); op.pop_back();
val.push_back(rezolva(a, b, o));
}
op.pop_back();
} else {
while (!op.empty() && prioritate(op.back()) >= prioritate(tok.at(i))) {
long long b = val.back(); val.pop_back();
long long a = val.back(); val.pop_back();
char o = op.back(); op.pop_back();
val.push_back(rezolva(a, b, o));
}
op.push_back(tok.at(i));
}
}
while (!op.empty()) {
long long b = val.back(); val.pop_back();
long long a = val.back(); val.pop_back();
char o = op.back(); op.pop_back();
val.push_back(rezolva(a, b, o));
}
return val.back();
}
int main() {
std::string expr;
std::getline(fi, expr);
fo << evaluare(expr);
return 0;
}