Cod sursa(job #2875572)

Utilizator KataIsache Catalina Kata Data 21 martie 2022 22:05:36
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("grader_test4.in");
ofstream fout("evaluare.out");
stack <char> semne;
stack <long long> operanzi;

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(y/x);
        }
    if(semne.top()=='*')
        {
            x=operanzi.top();
            operanzi.pop();
            y=operanzi.top();
            operanzi.pop();
            operanzi.push(1ll*x*y);
        }
    semne.pop();
}

int main()
{
    string s;
    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]=='*')
            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--;
            cout<<nr<<'\n';
            operanzi.push(nr);
        }
    }
    while(!semne.empty())
        calcul();
    fout<<operanzi.top();
    return 0;
}