Cod sursa(job #3166570)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 8 noiembrie 2023 23:46:40
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

FILE *fin, *fout;

int evaluate_stack(deque<int> &numbers, deque<char> &operators) {
    int result = numbers.front();
    numbers.pop_front();
    while (!numbers.empty()) {
        char op = operators.front();
        operators.pop_front();

        if (op == '+')
            result =  result + numbers.front();
        else
            result =  result - numbers.front();
        numbers.pop_front();
    }
    return result;
}

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

    int number;
    char c = fgetc(fin);

    while (c != ')' && c != EOF && c != '\n') {
        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;
}