Cod sursa(job #2358657)

Utilizator StanCatalinStanCatalin StanCatalin Data 28 februarie 2019 11:07:39
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <stack>

using namespace std;

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

const int dim = 100005;

char s[dim];

int operant(char a)
{
    if (a == '+' || a == '-')
    {
        return 1;
    }
    if (a == '*' || a == '/')
    {
        return 2;
    }
    return 0;
}

int AplicareOp(int a,int b,char op)
{
    switch (op)
    {
    case '+' :
        return a+b;
    case '-' :
        return a-b;
    case '*' :
        return a*b;
    case '/' :
        return a/b;
    }
}

int Evalueaza()
{
    int i = 0;
    stack <int> val;
    stack <char> op;
    while (s[i] != NULL)
    {
        if (s[i] == '(')
        {
            op.push(s[i]);
        }
        else if (s[i] >= '0' && s[i] <= '9')
        {
            int valu = 0;
            while (s[i]!= NULL && s[i] >= '0' && s[i] <= '9')
            {
                valu = valu*10 + s[i] - '0';
                i++;
            }
            i--;
            val.push(valu);
        }
        else if (s[i] == ')')
        {
            while (!op.empty() && op.top() != '(')
            {
                int val2 = val.top();
                val.pop();
                int val1 = val.top();
                val.pop();
                char op1 = op.top();
                op.pop();
                val.push(AplicareOp(val1,val2,op1));
            }
            op.pop();
        }
        else
        {
            while (!op.empty() && operant(op.top()) >= operant(s[i]))
            {
                int val2 = val.top();
                val.pop();
                int val1 = val.top();
                val.pop();
                char op1 = op.top();
                op.pop();
                val.push(AplicareOp(val1,val2,op1));
            }
            op.push(s[i]);
        }
        i++;
    }
    while (!op.empty())
    {
        int val2 = val.top();
        val.pop();
        int val1 = val.top();
        val.pop();
        char op1 = op.top();
        op.pop();
        val.push(AplicareOp(val1,val2,op1));
    }
    return val.top();
}

int main()
{
    in >> s;
    out << Evalueaza();
    return 0;
}