Cod sursa(job #3253421)

Utilizator Her0ninjaDragos Rolland Her0ninja Data 2 noiembrie 2024 16:07:11
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
#include <cctype>
#include <cmath>

using namespace std;

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

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

int kiertekeles(const string &e) {
    stack<int> ertekek;
    stack<char> ops;

    for (size_t i = 0; i < e.length(); i++) {
        if (isspace(e[i])) continue;

        if (isdigit(e[i])) {
            int val = 0;
            while (i < e.length() && isdigit(e[i])) {
                val = (val * 10) + (e[i] - '0');
                i++;
            }
            ertekek.push(val);
            i--;
        }
        else if (e[i] == '(') {
            ops.push(e[i]);
        }
        else if (e[i] == ')') {
            while (!ops.empty() && ops.top() != '(') {
                int val2 = ertekek.top(); ertekek.pop();
                int val1 = ertekek.top(); ertekek.pop();
                char op = ops.top(); ops.pop();
                ertekek.push(muveletek(val1, val2, op));
            }
            ops.pop();
        }

        else if (e[i] == '+' || e[i] == '-' ||e[i] == '*' || e[i] == '/') {
            while (!ops.empty() && elsoseg(ops.top()) >= elsoseg(e[i])) {
                int val2 = ertekek.top(); ertekek.pop();
                int val1 = ertekek.top(); ertekek.pop();
                char op = ops.top(); ops.pop();
                ertekek.push(muveletek(val1, val2, op));
            }
            ops.push(e[i]);
        }
    }

    while (!ops.empty()) {
        int val2 = ertekek.top(); ertekek.pop();
        int val1 = ertekek.top(); ertekek.pop();
        char op = ops.top(); ops.pop();
        ertekek.push(muveletek(val1, val2, op));
    }

    return ertekek.top();
}

int main() {
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");

    string e;
    getline(f, e);
    int megold = kiertekeles(e);
    g << megold << endl;

    f.close();
    g.close();

    return 0;
}