Cod sursa(job #3259508)

Utilizator Alex283810Mocan Alexandru Valnetin Alex283810 Data 26 noiembrie 2024 17:58:07
Problema Evaluarea unei expresii Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <cstring>
#include <stack>
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");
std::string ec;
std::stack<int>s;
std::stack<int>f;
std::stack<char>operatii;
std::pair<int,int> numar(std::string ec,int i)
{
    int ans=0;
    while(i<ec.size()&&ec[i]>='0'&&ec[i]<='9')
    {
        ans*=10;
        ans+=ec[i]-'0';
        i++;
    }
    return std::make_pair(ans,--i);
}
void fa()
{
    long long x;
    x=s.top();
    s.pop();
    if(operatii.top()=='+')
    {
        s.top()+=x;
    }
    else if(operatii.top()=='-')
    {
        s.top()-=x;
    }
    else if(operatii.top()=='*')
    {
        s.top()*=x;
    }
    else if(operatii.top()=='/')
    {
        s.top()/=x;
    }
    operatii.pop();
}
int main()
{
    std::ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);
    getline(fin,ec);
    for(int i=0;i<ec.length();i++)
    {
        if(ec[i]=='(')
        {
            operatii.push('(');
            i++;
            std::pair<int,int>r=numar(ec,i);
            s.push(r.first);
            i=r.second;
        }
        else if(ec[i]==')')
        {
            while(operatii.top()!='(')
            {
                fa();
            }
            operatii.pop();
            //std::cout<<s.top()<<' '<<i<<'\n';
        }
        else if(ec[i]>='0'&&ec[i]<='9')
        {
            std::pair<int,int>r=numar(ec,i);
            s.push(r.first);
            i=r.second;
        }
        else if(ec[i]=='-'||ec[i]=='+'||ec[i]=='*'||ec[i]=='/')
        {
            while(!operatii.empty()&&operatii.top()!='('&&((ec[i]=='+'||ec[i]=='-')||((ec[i]=='*'||ec[i]=='/')&&(operatii.top()=='/'||operatii.top()=='*')))) 
                fa();
            operatii.push(ec[i]);
        }
    }
    while(!operatii.empty())
    {
        fa();
    }
    fout<<s.top();
    return 0;
}