Cod sursa(job #2575712)

Utilizator Fatu_SamuelFatu Samuel Fatu_Samuel Data 6 martie 2020 15:07:39
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <bits/stdc++.h>

using namespace std;

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

string s;

map < char, int > m;

stack < int, vector < int > >  val;
stack < char, vector < char > > op;

int Calc(int a, int b, char o)
{
    switch (o)
    {
        case '+':  return a + b;

        case '-': return a - b;

        case '*': return a * b;

        case '/': return a / b;
    }
}

int main()
{
    fin >> s;

    m['*'] = 10;
    m['/'] = 10;
    m['+'] = 1;
    m['-'] = 1;
    m['('] = -1;

    int st = s.length();

    for (int i = 0; i < st; i++)
    {
        if (s[i] == '(')
            op.push('(');
        else if (s[i] == ')')
        {
            while (!op.empty() && op.top() != '(')
            {
                char o = op.top();
                op.pop();

                int a = val.top();
                val.pop();

                int b = val.top();
                val.pop();

                val.push(Calc(b, a, o));
            }

            if (!op.empty())
                op.pop();
        }
        else if (isdigit(s[i]))
        {
            int nr = 0;

            while (isdigit(s[i]))
            {
                nr = nr * 10 + s[i] - 48;
                i++;
            }

            i--;

            val.push(nr);
        }
        else
        {
            if (!op.empty() && m[op.top()] >= m[s[i]] )
            {
                char o = op.top();
                op.pop();

                int a = val.top();
                val.pop();

                int b = val.top();
                val.pop();

                val.push(Calc(b, a, o));
            }

            op.push(s[i]);
        }
    }

    while (!op.empty())
    {
        char o = op.top();
        op.pop();

        int a = val.top();
        val.pop();

        int b = val.top();
        val.pop();

        val.push(Calc(b, a, o));
    }

    fout << val.top();

    fin.close();
    fout.close();
    return 0;
}