Cod sursa(job #2875573)

Utilizator KataIsache Catalina Kata Data 21 martie 2022 22:06:08
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
stack <char> semne;
stack <long long> operanzi;
string s;
void calcul()
{
    long long x,y;
    if(semne.top()=='+')
        {
            x=operanzi.top();
            operanzi.pop();
            y=operanzi.top();
            operanzi.pop();
            operanzi.push(x+y);
        }
    if(semne.top()=='-')
        {
            x=operanzi.top();
            operanzi.pop();
            y=operanzi.top();
            operanzi.pop();
            operanzi.push(y-x);
        }
    if(semne.top()=='/')
        {
            x=operanzi.top();
            operanzi.pop();
            y=operanzi.top();
            operanzi.pop();
            operanzi.push(1ll*y/x);
        }
    if(semne.top()=='*')
        {
            x=operanzi.top();
            operanzi.pop();
            y=operanzi.top();
            operanzi.pop();
            operanzi.push((1ll*(x)*(y)));
        }
  // cout<<y<<" "<<semne.top()<<" "<<x<<"="<<operanzi.top()<<'\n';
    semne.pop();
}

int main()
{
    getline(fin, s);
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='(')
            semne.push('(');
        if(s[i]==')')
        {
            while (semne.top()!='(')
                calcul();
            semne.pop();
        }
        if(s[i]=='+')
        {
            while(!semne.empty() && (semne.top()=='*' || semne.top()=='/' || semne.top()=='-' || semne.top()=='+'))
                calcul();
            semne.push('+');
        }
        if(s[i]=='-')
        {
            while(!semne.empty() && (semne.top()=='*' || semne.top()=='/' || semne.top()=='-' || semne.top()=='+'))
                calcul();
            semne.push('-');
        }
        if(s[i]=='/' || s[i]=='*')
        {
            while(!semne.empty() && (semne.top()=='*' || semne.top()=='/' ))
                calcul();
        semne.push(s[i]);
        }
        if(s[i]>='0' && s[i]<='9')
        {
            long long nr=s[i]-'0';
            i++;
            while(s[i]>='0' && s[i]<='9')
            {
                nr*=10;
                nr+=1ll*(s[i]-'0');
                i++;
            }
            i--;

            operanzi.push(nr);
        }
    }
    while(!semne.empty())
        calcul();
    fout<<operanzi.top();
    return 0;
}