Cod sursa(job #1574230)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 20 ianuarie 2016 13:13:00
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <algorithm>
#include <string>
#include <stack>

using namespace std;

string expr, semn, eval, ss;
int p[256];
stack <int> st;

int main ()
{
    p['('] = p[')'] = 0;
    p['+'] = p['-'] = 1;
    p['*'] = p['/'] = 2;

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

    fin >> expr;

    expr = '(' + expr + ')';
    for (int i = 0; i < expr.size (); ++i)
    {
        if ('0' <= expr[i] && expr[i] <= '9') eval += expr[i];
        else if ('0' <= expr[i - 1] && expr[i - 1] <= '9') eval += ",";
        else
        {
            while (!semn.empty () && p[semn[semn.size () - 1]] >= p[expr[i]])
            {
                eval += semn[semn.size () - 1];
                semn.erase (semn.size () - 1, 1);
            }

            eval += ",";
            semn += expr[i];
        }
    }

    bool OK = true;
    int nr = 0;
    for (int i = 0; i < eval.size (); ++i)
    {
        if (eval[i] != ',')
        {
            ss += eval[i];
            if (ss[i] < '0' || ss[i] > '9') OK = false;
            if (OK) nr = nr * 10 + ss[i] - 48;
            continue;
        }

        if (OK) st.push (nr);
        else
            for (int i = 0; i < ss.size (); ++i)
            {
                int rez = st.top ();
                st.pop ();

                if (ss[i] == '*') rez *= st.top ();
                else if (ss[i] == '/') rez /= st.top ();
                else if (ss[i] == '+') rez += st.top ();
                else rez -= st.top ();

                st.pop ();
                st.push (rez);
            }

        ss.clear ();
        nr = 0;
        OK = true;
    }

    printf ("%d\n", st.top ());

    return 0;
}