Cod sursa(job #3274943)

Utilizator csamoilasamoila ciprian casian csamoila Data 8 februarie 2025 14:29:10
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <stack>

using namespace std;

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

char sir[100001];

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

int isoperation(char c) {
    if (c == '+' || c == '-' || c == '*' || c == '/')
        return 1;
    return 0;
}

void eval(stack<int>& s, char op) {
    int dr = s.top(); s.pop();
    int st = s.top(); s.pop();
    switch (op) {
        case '+': s.push(st + dr);
            break;
        case '-': s.push(st - dr);
            break;
        case '*': s.push(st * dr);
            break;
        case '/': s.push(st / dr);
            break;
    }
}

int main()
{
    fin.getline(sir, 100001);
    int n = strlen(sir);
    stack<int> s;
    stack<char> op;
    for (int i = 0; i < n; i++) {
        if (isdigit(sir[i])) {
            int nr = 0;
            while (i < n && isdigit(sir[i])) {
                nr = nr * 10 + sir[i] - '0';
                i++;
            }
            i--;
            s.push(nr);
        }
        else if (sir[i] == '(') {
            op.push('(');
        }
        else if (isoperation(sir[i])) {
            char o = sir[i];
            while (!op.empty() && rang(o) <= rang(op.top())) {
                eval(s, op.top());
                op.pop();
            }
            op.push(o);
        }
        else {
            while (op.top() != '(') {
                eval(s, op.top());
                op.pop();
            }
            op.pop();
        }
    }
    while (!op.empty()) {
        eval(s, op.top());
        op.pop();
    }
    fout << s.top();
    return 0;
}