Cod sursa(job #2864736)

Utilizator matei123Biciusca Matei matei123 Data 8 martie 2022 10:27:05
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

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

int operatie(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 evaluare(string tokens)
{   stack<int>values;
    stack<char>ops;
    for(int i = 0; i < tokens.length(); i++)
    {   if(tokens[i] == ' ')
            continue;
        else if(tokens[i] == '(')
            ops.push(tokens[i]);
        else if(isdigit(tokens[i]))
        {   int val = 0;
            while(i < tokens.length() && isdigit(tokens[i]))
            {   val = (val*10) + (tokens[i]-'0');
                i++;
            }
            values.push(val);
        }
        else if(tokens[i] == ')')
        {   while(!ops.empty() && ops.top() != '(')
            {   int val2 = values.top();
                values.pop();
                int val1 = values.top();
                values.pop();
                char op = ops.top();
                ops.pop();
                values.push(operatie(val1, val2, op));
            }
            if(!ops.empty())
               ops.pop();
        }
        else
        {   while(!ops.empty() && prioritate(ops.top()) >= prioritate(tokens[i]))
            {   int val2 = values.top();
                values.pop();
                int val1 = values.top();
                values.pop();
                char op = ops.top();
                ops.pop();
                values.push(operatie(val1, val2, op));
            }
            ops.push(tokens[i]);
        }
    }
    while(!ops.empty())
    {   int val2 = values.top();
        values.pop();
        int val1 = values.top();
        values.pop();
        char op = ops.top();
        ops.pop();
        values.push(operatie(val1, val2, op));
    }
    return values.top();
}

int main()
{   string expresie;
    fin >> expresie;
    fout << evaluare(expresie);
    fout.close();
}