Cod sursa(job #2991099)

Utilizator dariustgameTimar Darius dariustgame Data 9 martie 2023 09:25:50
Problema Evaluarea unei expresii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 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;

int main()
{
    fin >> expr;
    op.push_back('(');
    expr += ')';
    for (int i = 0; i < expr.size(); i++)
    {
        if (expr[i] >= '0' && expr[i] <= '9')
        {
            int temp = 0;
            while (expr[i] >= '0' && expr[i] <= '9')
            {
                temp += expr[i] - '0';
                temp *= 10;
                i++;
            }
            i--;
            nr.push_back(temp / 10);
        }
        else if (expr[i] == '(')
        {
            op.push_back(expr[i]);
        }
        else if (!nr.empty() && (op[op.size() - 1] == '*' || op[op.size() - 1] == '/'))
        {
            int aux = nr[nr.size() - 1];
            nr.pop_back();
            //cout << aux << ' ' << nr.top() << ' ' << op.top() << '\n';
            switch(op[op.size() - 1])
            {
                case '/': nr[nr.size() - 1] /= aux; break;
                case '*': nr[nr.size() - 1] *= aux; break;
            }
            op.pop_back();
            //cout << nr.top() << ' ';
            i--;
        }
        else if (expr[i] == '-' || expr[i] == '+' || expr[i] == '/' || expr[i] == '*')
        {
            op.push_back(expr[i]);
        }
        else if (expr[i] == ')')
        {
            while (op[op.size() - 1] != '(')
            {
                int aux = nr[nr.size() - 1];
                nr.pop_back();
                //cout << aux << ' ' << nr.top() << ' ' << op.top() << '\n';
                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();
                //cout << nr.top() << ' ';
            }
            op.pop_back();
        }
    }
    fout << nr[nr.size() - 1];
    return 0;
}