Pagini recente » Cod sursa (job #2751473) | Cod sursa (job #282535) | Cod sursa (job #1505480) | Cod sursa (job #3280676) | Cod sursa (job #1892094)
#include <cstdio>
#include <string>
#include <stack>
#define NAME "evaluare"
#define MAXN 100001
using namespace std;
auto fin = fopen(NAME ".in", "r");
auto fout = fopen(NAME ".out", "w");
string e;
int result;
stack<int> a;
stack<char> b;
void input() {
char proxy[MAXN];
fscanf(fin, "%s", proxy);
e = proxy;
}
void output() {
fprintf(fout, "%d\n", result);
}
bool isOperator(char c) {
auto operators = {'+', '/', '*', '-'};
for (auto op: operators)
if (c == op)
return true;
return false;
}
int precedence(char c) {
switch (c) {
case '+':
case '-':
return 2;
case '*':
case '/':
return 1;
}
return 3;
}
bool isOperand(char c) {
return c >= '0' && c <= '9';
}
int applyOperator(char op, int v1, int v2) {
// printf("Calculating %d%c%d\n", v1, op, v2);
switch(op) {
case '+': return v1 + v2;
case '-': return v1 - v2;
case '*': return v1 * v2;
case '/': return v1 / v2;
}
return 0;
}
void applyComputation() {
auto v2 = a.top(); a.pop();
auto v1 = a.top(); a.pop();
a.push(applyOperator(b.top(), v1, v2));
b.pop();
}
void solve() {
for (auto i = 0u; i < e.size(); ++i) {
if (isOperand(e[i])) {
auto number = 0;
while (i < e.size() && isOperand(e[i]))
number = number * 10 + e[i++] - '0';
--i;
a.push(number);
}
else if (isOperator(e[i])) {
while (!b.empty() && precedence(b.top()) <= precedence(e[i]))
applyComputation();
b.push(e[i]);
}
else if (e[i] == '(') {
// printf("Opening brace\n");
b.push(e[i]);
}
else if (e[i] == ')') {
// printf("Closing brace\n");
while (b.top() != '(')
applyComputation();
b.pop();
}
}
while (!b.empty())
applyComputation();
result = a.top();
}
int main() {
input();
solve();
output();
return 0;
}