Cod sursa(job #3241348)

Utilizator Mihai_999Diaconeasa Mihai Mihai_999 Data 29 august 2024 13:18:58
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#define nl '\n'

using namespace std;

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

string expresie;
stack<char> ops;
stack<int> numbers;
vector<char> RPN;
int priority[256];

int calculate(int a, int b, char op)
{
    if (op == '+')
        return a+b;
    else if (op == '-')
        return a-b;
    else if (op == '*')
        return a*b;
    else if (op == '/')
        return a/b;
    return 0;
}

void evaluate(int i)
{
    if (i == expresie.size())
    {
        while (!ops.empty())
        {
            RPN.push_back(ops.top());
            int b = numbers.top();
            numbers.pop();
            int a = numbers.top();
            numbers.pop();
            numbers.push(calculate(a, b, ops.top()));
            ops.pop();
        }
        return;
    }
    if ('0' <= expresie[i] && expresie[i] <= '9')
    {
        int number = 0;
        while ('0' <= expresie[i] && expresie[i] <= '9')
        {
            RPN.push_back(expresie[i]);
            number = number*10+expresie[i++]-'0';
        }
        numbers.push(number);
        i--;
    }
    else if (expresie[i] == '(')
        ops.push(expresie[i]);
    else if (expresie[i] == ')')
    {
        while (ops.top() != '(')
        {
            RPN.push_back(ops.top());
            int b = numbers.top();
            numbers.pop();
            int a = numbers.top();
            numbers.pop();
            numbers.push(calculate(a, b, ops.top()));
            ops.pop();
        }
        ops.pop();
    }
    else
    {
        while (!ops.empty() && priority[expresie[i]] <= priority[ops.top()])
        {
            RPN.push_back(ops.top());
            int b = numbers.top();
            numbers.pop();
            int a = numbers.top();
            numbers.pop();
            numbers.push(calculate(a, b, ops.top()));
            ops.pop();
        }
        ops.push(expresie[i]);
    }
    evaluate(i+1);
}

int main()
{
    priority['+'] = priority['-'] = 1;
    priority['*'] = priority['/'] = 2;
    fin >> expresie;
    evaluate(0);
    fout << numbers.top();
    return 0;
}