Cod sursa(job #2890505)

Utilizator ParutixLungeanu Razvan Parutix Data 15 aprilie 2022 19:09:05
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <stack>

std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");

int priority(char op)
{
    if (op == '+' || op == '-') return 1;
    else if (op == '*' || op == '/') return 2;
    return 0;
}

int applyOperator(int a, int b, char op)
{
    switch (op)
    {
    case '+': return a + b; 
    case '-': return a - b;
    case '*': return a * b;
    case '/': return a / b;
    } 
}

int expressionEvaluate(std::string s)
{
    std::stack<int> val;
    std::stack<char> op;
    int len = s.length(), i;
    
    for (i = 0; i < len; ++i)
    {
        if (s[i] == ' ') continue;
        if (s[i] == '(') op.push(s[i]);
        else if (isdigit(s[i]))
        {
            int number = 0;
            while (i < len && isdigit(s[i]))
            {
                number = (number * 10) + (s[i] - '0');
                i++;
            }
            val.push(number);
            i--;
        }
        else if (s[i] == ')')
        {
            while (!op.empty() && op.top() != '(')
            {
                char ch = op.top();
                op.pop();

                int x = val.top();
                val.pop();

                int y = val.top();
                val.pop();

                int z = applyOperator(y, x, ch);
                val.push(z);
            }
            if (!op.empty()) op.pop();
        }
        else
        {
            while (!op.empty() && priority(op.top()) >= priority(s[i]))
            {
                int x = val.top();
                val.pop();

                int y = val.top();
                val.pop();

                char opr = op.top();
                op.pop();

                val.push(applyOperator(y, x, opr));
            }
            op.push(s[i]);
        }
    }

    while (!op.empty())
    {
        int x = val.top();
        val.pop();

        int y = val.top();
        val.pop();

        char opr = op.top();
        op.pop();

        val.push(applyOperator(y, x, opr));
    }

    return val.top();
}

int main()
{
    std::string expression;
    fin >> expression;
    fout << expressionEvaluate(expression);
}