Cod sursa(job #2872321)

Utilizator shutdownRadu Dumitrache shutdown Data 16 martie 2022 20:01:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.47 kb
#include <fstream>
#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int precedence(char op)
{
    if (op=='+' || op=='-')
        return 1;
    else if (op=='/' || op=='*')
        return 2;
    return 0;
}
int applyOp(int a,int b,char op)
{
    switch (op)
    {
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '/':
        return a/b;
    case '*':
        return a*b;
    }
    return 0;
}
int evaluate (string tokens)
{

    stack <int> values;
    stack <char> ops;
    for (int i=0; i<tokens.length(); i++)
    {
       // cout<<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);
            i--;
            //  cout<<val<<'\n';
        }
        else if (tokens[i]==')')
        {
            while (!ops.empty() && ops.top()!='(')
            {
                int val2=values.top();
                values.pop();
              //  cout<<val2<<' ';
                int val1=values.top();
                //cout<<val1<<' ';
                values.pop();
                char op=ops.top();
                ops.pop();
                values.push(applyOp(val1,val2,op));
            }
            if (!ops.empty())
                ops.pop();
        }
        else
        {
            while (!ops.empty() && precedence(ops.top())>=precedence(tokens[i]))
            {
                int val2=values.top();
                values.pop();

                int val1=values.top();

                values.pop();
                char op=ops.top();
                ops.pop();
                values.push(applyOp(val1,val2,op));
            }
            ops.push(tokens[i]);

        }
      //  cout<<'\n';
    }
    while (!ops.empty())
    {
        int val2=values.top();
        values.pop();
        int val1=values.top();
        values.pop();
        char op=ops.top();
        ops.pop();
        values.push(applyOp(val1,val2,op));

    }
    return values.top();
}
string expr;
int main()
{
    fin>>expr;
  //  cout<<expr;
    fout<<evaluate(expr);
    return 0;
}