Cod sursa(job #2758904)

Utilizator HerddexJinga Tudor Herddex Data 14 iunie 2021 10:41:49
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.88 kb
#include <fstream>
#include <string>
#include <stack>
#include <queue>

using namespace std;

struct ExpressionEntity {
    bool isNumber = false;
    char _operator = 0;
    int _operand = 0;
};

inline bool isDigit(char c) {
    return '0' <= c && c <= '9';
}

int main() {
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");

    string expression;
    fin >> expression;

    stack<char> s;
    queue<ExpressionEntity> q;

    for (int i = 0; i < expression.length(); i++) {
        if (isDigit(expression[i])) {
            int j = i;
            while (isDigit(expression[i]))
                i++;

            ExpressionEntity e;
            e.isNumber = true;
            e._operand = stoi(expression.substr(j, i - j));

            q.push(e);

            i--;
        }
        else switch (expression[i]) {
            case '(':
                s.push('(');
                break;
            case ')':
                while (s.top() != '(') {
                    ExpressionEntity e;
                    e._operator = s.top();
                    q.push(e);
                    s.pop();
                }
                s.pop();
                break;
            case '+':
            case '-':
                while (!s.empty() && s.top() != '(') {
                    ExpressionEntity e;
                    e._operator = s.top();
                    q.push(e);
                    s.pop();
                }
                s.push(expression[i]);
                break;
            case '*':
            case '/':
                while (!s.empty() && (s.top() == '*' || s.top() == '/')) {
                    ExpressionEntity e;
                    e._operator = s.top();
                    q.push(e);
                    s.pop();
                }
                s.push(expression[i]);
                break;
        }
    }

    while (!s.empty()) {
        ExpressionEntity e;
        e._operator = s.top();
        q.push(e);
        s.pop();
    }

    stack<ExpressionEntity> S;

    while (!q.empty()) {
        auto e = q.front();
        q.pop();
        if (e.isNumber)
            S.push(e);
        else {
            int op2 = S.top()._operand;
            S.pop();
            int op1 = S.top()._operand;
            S.pop();
            int result = 0;
            switch (e._operator) {
                case '+':
                    result = op1 + op2;
                    break;
                case '-':
                    result = op1 - op2;
                    break;
                case '*':
                    result = op1 * op2;
                    break;
                case '/':
                    result = op1 / op2;
                    break;
            }
            ExpressionEntity E;
            E.isNumber = true;
            E._operand = result;
            S.push(E);
        }
    }

    ExpressionEntity result = S.top();
    fout << result._operand;

    return 0;
}