Cod sursa(job #3149764)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 12 septembrie 2023 10:27:35
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
//
// Created by mihai145 on 12.09.2023.
//

#include <fstream>
#include <string>
#include <stack>

using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");

int main() {
    string s;
    cin >> s;

    stack<int> vals;
    stack<char> symbols;

    auto precedence = [](char c) {
        if (c == '+' || c == '-') return 1;
        if (c == '*' || c == '/') return 2;
        return 0;
    };

    auto perform_op = [&]() {
        char c = symbols.top();
        symbols.pop();
        int v2 = vals.top();
        vals.pop();
        int v1 = vals.top();
        vals.pop();

        switch (c) {
            case '+':
                v1 += v2;
                break;
            case '-':
                v1 -= v2;
                break;
            case '*':
                v1 *= v2;
                break;
            case '/':
                v1 /= v2;
                break;
            default:
                break;
        }

        vals.push(v1);
    };

    for (int i = 0; i < (int) s.size(); i++) {
        if (!isdigit(s[i])) {
            if (s[i] == '(') {
                symbols.push('(');
                continue;
            }

            if (s[i] == ')') {
                while (symbols.top() != '(') {
                    perform_op();
                }
                symbols.pop();
                continue;
            }

            while ((int) symbols.size() > 0 && precedence(symbols.top()) >= precedence(s[i])) {
                perform_op();
            }
            symbols.push(s[i]);
        } else {
            int val = 0;
            while (i < (int) s.size() && isdigit(s[i])) {
                val = val * 10 + s[i] - '0';
                i++;
            }
            i--; // we overshoot by 1

            vals.push(val);
        }
    }

    while ((int) vals.size() > 1) {
        perform_op();
    }

    cout << vals.top() << '\n';
    return 0;
}