Cod sursa(job #2990749)

Utilizator dariustgameTimar Darius dariustgame Data 8 martie 2023 14:25:16
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <string>

using namespace std;

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

string expr;
stack<int> nr;
stack<char> op;

int main()
{
    fin >> expr;
    op.push('(');
    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(temp / 10);
        }
        if (!nr.empty() && (op.top() == '*' || op.top() == '/'))
        {
            int aux = nr.top();
            nr.pop();
            switch(op.top())
            {
                case '/': nr.top() /= aux; break;
                case '*': nr.top() *= aux; break;
            }
            op.pop();
        }
        if (expr[i] == '-' || expr[i] == '+' || expr[i] == '/' || expr[i] == '*')
        {
            op.push(expr[i]);
        }
        if (expr[i] == '(')
        {
            op.push(expr[i]);
        }
        if (expr[i] == ')')
        {
            while (op.top() != '(')
            {
                int aux = nr.top();
                nr.pop();
                switch(op.top())
                {
                    case '+': nr.top() += aux; break;
                    case '-': nr.top() -= aux; break;
                    case '/': nr.top() /= aux; break;
                    case '*': nr.top() *= aux; break;
                }
                op.pop();
            }
            op.pop();
        }
    }
    fout << nr.top();
    return 0;
}