Pagini recente » Cod sursa (job #2030271) | Cod sursa (job #565624) | Cod sursa (job #154460) | Cod sursa (job #642840) | Cod sursa (job #3256218)
#include <iostream>
#include <string>
#include <stack>
class Solution {
private:
std::stack<char> operator_stk;
std::stack<int> operand_stk;
void performTop() {
int a = operand_stk.top(); operand_stk.pop();
int b = operand_stk.top(); operand_stk.pop();
operand_stk.push(eval(a, b, operator_stk.top()));
operator_stk.pop();
}
bool isDigit(char ch) {
return '0' <= ch && ch <= '9';
}
int pirority(char op) {
if (op == '+' || op == '-')
return 1;
else if (op == '*' || op == '/')
return 2;
return 0;
}
int eval(int a, int b, char op) {
if (op == '+')
return a + b;
else if (op == '-')
return b - a;
else if (op == '*')
return a * b;
else if (op == '/')
return b / a;
}
public:
int compute(const std::string& s) {
for (int i = 0; i < s.size(); ++i) {
if (isDigit(s[i])) {
int number = 0;
while (i < s.size() && isDigit(s[i])) {
number = number * 10 + s[i] - '0';
i++;
}
i--;
operand_stk.push(number);
} else if (s[i] == '(') {
operator_stk.push('(');
} else if (s[i] == ')') {
while (operator_stk.top() != '(')
performTop();
operator_stk.pop();
} else if (s[i] != ' ') {
while (!operator_stk.empty() && pirority(operator_stk.top()) >= pirority(s[i]))
performTop();
operator_stk.push(s[i]);
}
}
while (!operator_stk.empty())
performTop();
return operand_stk.top();
}
};
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
std::string input;
std::cin >> input;
std::cout << Solution().compute(input) << std::endl;
return 0;
}