Cod sursa(job #3256218)

Utilizator AurelVAurel Vidru AurelV Data 13 noiembrie 2024 20:26:30
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#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;
}