Cod sursa(job #3166564)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 8 noiembrie 2023 23:21:04
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

FILE *fin, *fout;

int evaluate_stack(vector<int> &numbers, vector<char> &operators) {
    int result = numbers.back();
    numbers.pop_back();
    while (!numbers.empty()) {
        char op = operators.back();
        operators.pop_back();

        if (op == '+')
            result += numbers.back();
        else
            result -= numbers.back();
        numbers.pop_back();
    }
    return result;
}

int compute() {
    vector<int> numbers;
    vector<char> operators;

    int number;
    char c = fgetc(fin);

    while (c != ')' && c != EOF) {
        if (c == ' ') {
            c = fgetc(fin);
            continue;
        }
        
        if (c == '+' || c == '-' || c == '*' || c == '/') {
            operators.push_back(c);
            c = fgetc(fin);
            continue;
        }

        if (c == '(') {
            number = compute();
            c = fgetc(fin);
        } else if (c >= '0' && c <= '9') {
            number = 0;
            while (c >= '0' && c <= '9') {
                number = number * 10 + (c - '0');
                c = fgetc(fin);
            }
        }

        if ((int)numbers.size() > 0) {
            if (operators.back() == '*') {
                number = numbers.back() * number;
                operators.pop_back();
                numbers.pop_back();
            }
            else if (operators.back() == '/') {
                number = numbers.back() / number;
                operators.pop_back();
                numbers.pop_back();
            }
        }
        numbers.push_back(number);
    }
    return evaluate_stack(numbers, operators);
}

int main()
{
    fin = fopen("evaluare.in", "r");
    fout = fopen("evaluare.out", "w");

    fprintf(fout, "%d\n", compute());
    fclose(fin);
    fclose(fout);
    return 0;
}