Cod sursa(job #2998622)

Utilizator dariustgameTimar Darius dariustgame Data 9 martie 2023 19:26:03
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;


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


string expr = "";
vector<int> nr;
vector<char> op;

void solveLast()
{
    int aux = nr[nr.size() - 1];
    nr.pop_back();
    switch (op[op.size() - 1])
    {
    case '+': nr[nr.size() - 1] += aux; break;
    case '-': nr[nr.size() - 1] -= aux; break;
    case '/': nr[nr.size() - 1] /= aux; break;
    case '*': nr[nr.size() - 1] *= aux; break;
    }
    op.pop_back();
}

void addNumber(int& i)
{
    int temp = 0;
    while (expr[i] >= '0' && expr[i] <= '9')
    {
        temp += expr[i] - '0';
        temp *= 10;
        i++;
    }
    i--;
    nr.push_back(temp / 10);
}

int prioritate(char a)
{
    if (a == '+' || a == '-')
    {
        return 0;
    }
    else if (a == '*' || a == '/')
    {
        return 1;
    }
    return -1;
}

int main()
{
    fin >> expr;
    op.push_back('(');
    expr += ')';
    for (int i = 0; i < expr.size(); i++)
    {
        if (expr[i] == '(')
        {
            op.push_back(expr[i]);
        }
        else if (expr[i] == ')')
        {
            while (op[op.size() - 1] != '(')
            {
                solveLast();
            }
            op.pop_back();
        }
        else if (expr[i] >= '0' && expr[i] <= '9')
        {
            addNumber(i);
        }
        else
        {
            while (prioritate(expr[i]) <= prioritate(op[op.size() - 1]))
            {
                solveLast();
            }
            op.push_back(expr[i]);
        }
    }
    fout << nr[nr.size() - 1];
    return 0;
}