Cod sursa(job #3259571)

Utilizator Alex283810Mocan Alexandru Valnetin Alex283810 Data 26 noiembrie 2024 19:26:09
Problema Evaluarea unei expresii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");
std::stack<int>s;
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=ans*10+(ec[i]-'0');
        i++;
    }
    return {ans,--i};
}
void fa()
{
    int b=s.top();
    s.pop();
    int a=s.top();
    s.pop();
    char op=operatii.top(); 
    operatii.pop();
    if(op=='+')s.push(a+b);
    else if(op=='-')s.push(a-b);
    else if(op=='*')s.push(a*b);
    else if(op=='/')s.push(a/b);
}
int main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::string ec;
    fin>>ec;
    for(int i=0;i<ec.length();i++)
    {
        if(ec[i]=='(') 
        {
            operatii.push('(');
        } 
        else if(ec[i]==')') 
        {
            while(!operatii.empty()&&operatii.top()!='(') 
            {
                fa();
            }
            if(!operatii.empty())operatii.pop();
        } 
        else if(ec[i]>='0'&&ec[i]<='9') 
        {
            std::pair<int,int>num=numar(ec, i);
            s.push(num.first);
            i=num.second;
        } 
        else if(ec[i]=='+'||ec[i]=='-'||ec[i]=='*'||ec[i]=='/') 
        {
            while(!operatii.empty()&&operatii.top()!='('&&((ec[i]=='+'||ec[i]=='-')&&((operatii.top()=='/'||operatii.top()=='*'))||((ec[i]=='*'||ec[i]=='/')&&(operatii.top()=='/'||operatii.top()=='*')))) 
            {
                fa();
            }
            operatii.push(ec[i]);
        }
    }
    while(!operatii.empty()) 
        fa();
        
    fout<<s.top();
    return 0;
}