Cod sursa(job #2875436)

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

void calcul()
{
    int 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(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')
        {
            int nr=s[i]-'0';
            i++;
            while(s[i]>='0' && s[i]<='9')
            {
                nr*=10;
                nr+=s[i]-'0';
                i++;
            }
            i--;
            operanzi.push(nr);
        }
    }
    while(!semne.empty())
        calcul();
    fout<<operanzi.top();
    return 0;
}