Cod sursa(job #2791887)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 31 octombrie 2021 12:19:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <stack>
using namespace std;

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

int factor(int &i, string &str)
{
    int a=0;
    while(i<str.size() and str[i]>='0' and str[i]<='9')
    {
        a=a*10+str[i]-'0';
        i++;
    }
    i--;
    return a;
}
int degree(char c)
{
    if(c=='+' or c=='-')
        return 1;
    else if(c=='/' or c=='*')
        return 2;
    return 0;
}
int calculate(int a, int b, char c)
{
    if(c=='+')
        return a+b;
    else if(c=='-')
        return a-b;
    else if(c=='*')
        return a*b;
    else if(c=='/')
        return a/b;
}
int evaluate(string str)
{
    stack<int>val;
    stack<char>op;
    for(int i=0;i<str.size();i++)
    {
        if(str[i]==' ')
            continue;
        else if(str[i]=='(')
             op.push(str[i]);
        else if(str[i]==')')
        {

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

                int val2=val.top();
                val.pop();
                int val1=val.top();
                val.pop();
                char c=op.top();
                op.pop();
                val.push(calculate(val1,val2,c));
            }

            op.pop();
        }
        else if(str[i]>='0' and str[i]<='9')
        {
            val.push(factor(i,str));
        }
        else
        {

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

                int val2=val.top();
                val.pop();
                int val1=val.top();
                val.pop();
                char c=op.top();
                op.pop();
                val.push(calculate(val1,val2,c));

            }

            op.push(str[i]);
        }
    }
    while(op.size()>0)
    {
        int val2=val.top();
        val.pop();
        int val1=val.top();
        val.pop();
        char c=op.top();
        op.pop();
        val.push(calculate(val1,val2,c));
    }

    int ans=val.top();

    val.pop();

    return ans;
}
int main()
{
    string str;
    getline(cin,str);
    cout<<evaluate(str);
    return 0;
}