Cod sursa(job #3342968)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 26 februarie 2026 11:14:36
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include <bits/stdc++.h>

using namespace std;

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

int priority(char x){
    if(x == '/' || x == '*') return 2;
    if(x == '+' || x == '-') return 1;
    return 0;
}
int operation(int a, int b, char operation){
    if(operation == '+') return a + b;
    if(operation == '-') return a - b;
    if(operation == '/') return a / b;
    if(operation == '*') return a * b;
    return 0;
}
vector<string>  convert_to_reverse_polish_notation(string expression){
    vector<string> result;
    stack<char> operations;


    for(int i = 0; i < expression.size(); i++){
        char current_symbol = expression[i];
        if(isdigit(current_symbol)){
            string new_number;
            while(i < expression.size() && isdigit(expression[i])){
                new_number += expression[i];
                i++;
            }
            i--;
            result.push_back(new_number);
        }
        else if(current_symbol == '('){
            operations.push(current_symbol);
        }
        else if(current_symbol == ')'){
            while(!operations.empty() && operations.top() != '('){
                result.push_back(string(1, operations.top()));

                operations.pop();
            }
            operations.pop();
        }
        else{
            while(!operations.empty() && priority(operations.top()) >= priority(current_symbol)){
                result.push_back(string(1, operations.top()));
                operations.pop();
            }
            operations.push(current_symbol);
        }
    }
    while(!operations.empty()){
        result.push_back(string(1, operations.top()));
        operations.pop();
    }
    return result;
}
int evaluate_expression(string expression){
    vector<string> postfix_expression = convert_to_reverse_polish_notation(expression);

    stack<int> numbers;
    for(int i = 0; i < postfix_expression.size(); i++){
        if(isdigit(postfix_expression[i][0])){
            numbers.push(stoi(postfix_expression[i]));
        }
        else{
            int a = numbers.top();
            numbers.pop();
            int b = numbers.top();
            numbers.pop();

            numbers.push(operation(b, a, postfix_expression[i][0]));

        }
    }
    return numbers.top();
}

int main()
{

    string expression;
    fin>>expression;

    int result = evaluate_expression(expression);
    fout<<result;
    return 0;
}