Cod sursa(job #3177304)

Utilizator dragoncrackCandidatu Mario Luca dragoncrack Data 28 noiembrie 2023 21:34:09
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.25 kb
#include <fstream>
#include <stack>
#include <map>
#define INF 1e9 + 5

using namespace std;

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

string input;
stack<int> calculations;
stack<char> operations;
stack<int> depth;
map<char, int> priority;

void compress() {
    int temp = calculations.top();
    calculations.pop();
    
    if (calculations.top() == INF)
        calculations.top() = temp;
    else {
        switch (operations.top())
        {
        case '+':
            calculations.top() += temp;
            break;
        case '*':
            calculations.top() *= temp;
            break;
        case '/':
            calculations.top() /= temp;
            break;
        }
        operations.pop();
        depth.pop();
    }
}

int main()
{
    priority['+'] = 2;
    priority['*'] = 1;
    priority['/'] = 1;

    calculations.push(INF);

    int count = 0;
    bool numberExists = false;
    bool negative = false;

    fin >> input;
    for (int i = 0; i < input.size(); i++) {
        if (isdigit(input[i])) {
            count *= 10;
            count += input[i] - '0';
            numberExists = true;
            if (negative) {
                count *= -1;
                negative = false;
            }
        }
        else if (numberExists) {
            if (input[i] != ')' && !operations.empty()) {
                if (priority[input[i]] < priority[operations.top()] && calculations.size() == depth.top()) {
                    calculations.push(INF);
                }
            }
            calculations.push(count);
            compress();
            count = 0;
            numberExists = false;
            if (input[i] != ')' && !operations.empty()) {
                if (priority[input[i]] > priority[operations.top()] && calculations.size() > 1 && calculations.size() == depth.top()) {
                    compress();
                }
            }
        }

        if (input[i] == '(') {
            calculations.push(INF);
        }

        if (input[i] == ')') {
            if (i + 1 != input.size()) {
                if (!operations.empty()) {
                    if (priority[input[i + 1]] >= priority[operations.top()] && calculations.size() - 1 == depth.top())
                        compress();
                }
            }
            else {
                compress();
            }
        }

        if (input[i] == '+') {
            operations.push('+');
            depth.push(calculations.size());
        }

        if (input[i] == '-') {
            operations.push('+');
            depth.push(calculations.size());
            negative = true;
            if (calculations.top() == INF)
                calculations.top() = 0;
        }

        if (input[i] == '*') {
            operations.push('*');
            depth.push(calculations.size());
        }

        if (input[i] == '/') {
            operations.push('/');
            depth.push(calculations.size());
        }
    }
    if (numberExists) {
        calculations.push(count);
        compress();
        count = 0;
        numberExists = false;
    }
    while (calculations.size() > 1)
        compress();
    fout << calculations.top();
}