Cod sursa(job #3253188)

Utilizator MikeStrikeAgache Mihai MikeStrike Data 1 noiembrie 2024 20:42:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#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;
}