Cod sursa(job #2874997)

Utilizator beingsebiPopa Sebastian beingsebi Data 20 martie 2022 17:07:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");
// #define f cin
// #define g cout
struct mdata
{
    int type; //0-op
              //1-nr
              //2-(
    int nr;
    char op;
};
vector<mdata> s;
int32_t main()
{

    for (char ch; f >> ch;)
    {
        if (isdigit(ch))
        {
            if (s.empty() || s.back().type != 1)
                s.push_back({1, 0, 0});
            s.back().nr = s.back().nr * 10 + ch - '0';
        }
        else if (ch == '(')
            s.push_back({2, 0, 0});
        else if (ch == '+' || ch == '-')
        {
            while (s.size() >= 3 && s.end()[-1].type == 1 && s.end()[-2].type == 0 && s.end()[-3].type == 1)
            {
                int n1 = s.end()[-3].nr, n2 = s.end()[-1].nr, op = s.end()[-2].op;
                if (op == '+')
                    n1 += n2;
                else if (op == '-')
                    n1 -= n2;
                else if (op == '*')
                    n1 *= n2;
                else
                    n1 /= n2;
                s.pop_back();
                s.pop_back();
                s.pop_back();
                s.push_back({1, n1, 0});
            }
            s.push_back({0, 0, ch});
        }
        else if (ch == '*' || ch == '/')
        {
            if (s.size() >= 3 && s.end()[-1].type == 1 && (s.end()[-2].op == '*' || s.end()[-2].op == '/') && s.end()[-3].type == 1)
            {
                int n1 = s.end()[-3].nr, n2 = s.end()[-1].nr, op = s.end()[-2].op;
                if (op == '*')
                    n1 *= n2;
                else
                    n1 /= n2;
                s.pop_back();
                s.pop_back();
                s.pop_back();
                s.push_back({1, n1, 0});
            }
            s.push_back({0, 0, ch});
        }
        else // )
        {
            while (s.end()[-2].type != 2)
            {
                int n1 = s.end()[-3].nr, n2 = s.end()[-1].nr, op = s.end()[-2].op;
                if (op == '+')
                    n1 += n2;
                else if (op == '-')
                    n1 -= n2;
                else if (op == '*')
                    n1 *= n2;
                else
                    n1 /= n2;
                s.pop_back();
                s.pop_back();
                s.pop_back();
                s.push_back({1, n1, 0});
            }

            auto ac = s.back();
            s.pop_back();
            s.pop_back();
            s.push_back(ac);
        }
    }
    while (s.size() >= 3)
    {
        int n1 = s.end()[-3].nr, n2 = s.end()[-1].nr, op = s.end()[-2].op;
        if (op == '+')
            n1 += n2;
        else if (op == '-')
            n1 -= n2;
        else if (op == '*')
            n1 *= n2;
        else
            n1 /= n2;
        s.pop_back();
        s.pop_back();
        s.pop_back();
        s.push_back({1, n1, 0});
    }
    g << s.back().nr;

    return 0;
}