Cod sursa(job #2190607)

Utilizator Narvik13Razvan Roatis Narvik13 Data 31 martie 2018 12:16:00
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
#include <cctype>

using namespace std;

ifstream f("evaluare.in");
ofstream o("evaluare.out");

string s;
stack <int> s_nr;
stack <char> s_sm;

int grad(char c)
{
    switch (c)
    {
    case '(':
        return 0;
    case ')':
        return 0;
    case '+':
        return 1;
    case '-':
        return 1;
    case '*':
        return 2;
    case '/':
        return 2;
    }
}

int operatie(int nr1, int nr2, char c)
{
    switch(c)
    {
    case '+':
        return nr1 + nr2;
    case '-':
        return nr1 - nr2;
    case '*':
        return nr1 * nr2;
    case '/':
        return nr1 / nr2;
    }
}

void do_operation()
{
    int nr2 = s_nr.top();
    s_nr.pop();
    int nr1 = s_nr.top();
    s_nr.pop();
    char semn = s_sm.top();
    s_sm.pop();
    int dbg = operatie(nr1,nr2,semn);
    s_nr.push(dbg);
    return;
}

int main()
{
    f >> s;
    s += ')';

    int len = s.size(), i = 0;

    s_sm.push('(');

    while(i < len)
    {
        if(isdigit(s.at(i)))
        {
            int nr = 0;
            while(i < len && isdigit(s.at(i)))
            {
                nr = nr * 10 + (int)(s.at(i)) - '0';
                i++;
            }
            s_nr.push(nr);
        }
        else
        {
            if(s.at(i) == '(')
            {
                s_sm.push('(');
            }
            else
            {
                while(grad(s_sm.top()) > grad(s.at(i)))
                {
                    do_operation();
                }
                char dcd = s.at(i);

                if(dcd == ')')
                    s_sm.pop();
                else
                    s_sm.push(s.at(i));
            }
            i++;

        }
    }

    o << s_nr.top();

    return 0;
}