Pagini recente » Cod sursa (job #1637911) | Cod sursa (job #25190) | Cod sursa (job #1538587) | Cod sursa (job #1541974) | Cod sursa (job #3253188)
#include <iostream>
#include <fstream>
#include <stack>
#include <cctype>
#include <string>
using namespace std;
int applyOperation(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return b != 0 ? a / b : 0;
}
return 0;
}
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
void evaluateTop(stack<int>& operands, stack<char>& operators) {
if (operands.size() < 2 || operators.empty()) return;
int b = operands.top(); operands.pop();
int a = operands.top(); operands.pop();
char op = operators.top(); operators.pop();
operands.push(applyOperation(a, b, op));
}
int evaluateExpression(const string& expression) {
stack<int> operands; // Stack to hold numbers
stack<char> operators; // Stack to hold operators
for (size_t i = 0; i < expression.size(); i++) {
if (isspace(expression[i])) continue;
if (isdigit(expression[i])) {
int value = 0;
while (i < expression.size() && isdigit(expression[i])) {
value = value * 10 + (expression[i] - '0');
i++;
}
operands.push(value);
i--;
}
else if (expression[i] == '(') {
operators.push(expression[i]);
}
else if (expression[i] == ')') {
while (!operators.empty() && operators.top() != '(') {
evaluateTop(operands, operators);
}
if (!operators.empty()) operators.pop();
}
else if (expression[i] == '+' || expression[i] == '-' ||
expression[i] == '*' || expression[i] == '/') {
while (!operators.empty() && precedence(operators.top()) >= precedence(expression[i])) {
evaluateTop(operands, operators);
}
operators.push(expression[i]);
}
}
while (!operators.empty()) {
evaluateTop(operands, operators);
}
return operands.empty() ? 0 : operands.top();
}
int main() {
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string expression;
fin >> expression;
int result = evaluateExpression(expression);
fout << result << endl;
return 0;
}