Cod sursa(job #2825150)

Utilizator bogikanagyNagy Boglarka bogikanagy Data 4 ianuarie 2022 09:59:06
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#include <deque>
#include <string>

#define ll long long

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

ll n, m=0, i, j,sum=0,a,b;
string s;

deque <ll> v, res;
int main()
{
    cin >> s;
    //s = '(' + s;
    s.insert(s.begin(),'(');
    s.push_back(')');

    //cout<<s;
    n = s.size();
    //cout<<n;

    for (i=0;i<n;++i)
    {
       // cout<<s[i-1]<<" ";
       if (s[i] == '(') v.push_front(-5);
       else if (s[i] == ')')
        {
            while (!v.empty() && v[0] != -5)
            {
                res.push_back(v[0]);
                if (!v.empty()) v.pop_front();
            }
            if (!v.empty()) v.pop_front();
        }
        else if (s[i]=='+'||s[i]=='-')
        {
            while (!v.empty()&& v[0]!=-5)
            {
                res.push_back(v[0]);
                if (!v.empty()) v.pop_front();
            }
            if (s[i]=='+') v.push_front(-1);
            else v.push_front(-3);
        }
        else if (s[i]=='*'||s[i]=='/')
        {
            while (!v.empty()&&v[0]%2==0)
            {
                res.push_back(v[0]);
                if (!v.empty()) v.pop_front();
            }
            if (s[i]=='*') v.push_front(-2);
            else v.push_front(-4);
        }
        else
        {
            m*=10;
            m+=s[i]-48;
            if (s[i+1]<48||s[i+1]>57)
            {
                res.push_back(m);
                m=0;
            }
        }
    }

    //for (auto e:res) cout<<e<<" ";

    v.clear();
    while (!res.empty())
    {
        if (res[0]>=0)
        {
            v.push_front(res[0]);
            res.pop_front();
        }
        else
        {
            a=v[1];
            b=v[0];
            v.pop_front();
            v.pop_front();
            j=res[0];
            res.pop_front();
            if (j==-1) v.push_front(a+b);
            else if (j==-2) v.push_front(a*b);
                else if (j==-3) v.push_front(a-b);
                    else v.push_front(a/b);
        }
    }
    cout<<v[0];
    return 0;
}