Cod sursa(job #2767653)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 7 august 2021 11:41:46
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.52 kb
#include <fstream>
#include <stack>

using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
int degree(char op)
{

    if(op == '+' or op == '-')

        return 1;

    if(op == '*' or op == '/')

        return 2;

    return 0;

}
int calculateOperation(int a, int b, char op)
{

    if(op == '+') return a+b;

    else

        if(op == '-') return a-b;

        else if(op == '/') return a/b;

        else if(op == '*') return a*b;
}
int evaluate(string e)
{
    stack<int> values;

    stack<char> op;

    for ( int i = 0; i < e.size(); ++i)
    {

        if(e[i] == ' ')

            continue;

        else if(e[i] == '(')
        {

            op.push(e[i]);

        }

        else if(e[i] >= '0' and e[i] <= '9')
        {

            int val = 0;

            while(i  < e.size() and e[i] >= '0' and e[i] <= '9')
            {

                val = val * 10 + e[i] - '0';

                ++i;

            }

            values.push(val);
            --i;
        }
        else if(e[i] == ')')
        {

            while(op.size() > 0 and op.top() != '(')
            {

                int val2 = values.top();

                values.pop();

                int val1 = values.top();

                values.pop();

                char operation = op.top();

                op.pop();

                values.push(calculateOperation(val1,val2,operation));

            }

            if(op.size() > 0) // (

                op.pop();

        }
//operatie

        else
        {

            while(op.size() >0 and  degree(op.top()) >= degree(e[i]))
            {

                int val2 = values.top();

                values.pop();

                int val1 = values.top();

                values.pop();

                char operation = op.top();

                op.pop();

                values.push(calculateOperation(val1,val2,operation));

            }

            op.push(e[i]);

        }

    } //inchid forul de parcuregerfe al lui e

    while(op.size() > 0)
    {

        int val2 = values.top();

        values.pop();

        int val1 = values.top();

        values.pop();

        char operation = op.top();

        op.pop();

        values.push(calculateOperation(val1,val2,operation));

    }

    int ans = values.top();

    values.pop();

    return ans;

}



int main()
{

    string a;

    cin >> a;

    cout << evaluate(a);

}