Cod sursa(job #3203798)

Utilizator Alex_Mihai10Mihai Alex-Ioan Alex_Mihai10 Data 14 februarie 2024 17:34:20
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char sir[100005];
int imp[300];
int care[300];
stack<char>semn;
int numar[100005];
stack<int>rez;

int main()
{
    imp['+']=1;
    imp['-']=1;
    imp['*']=2;
    imp['/']=2;
    care['+']=1;
    care['-']=2;
    care['*']=3;
    care['/']=4;

    fin.getline(sir,100005);
    int i;
    for(i=0;sir[i];++i)
        if(isdigit(sir[i]))
        {
            int nr=0;
            while(isdigit(sir[i]))
            {
                nr=nr*10+(sir[i]-'0');
                ++i;
            }
            --i;
            numar[++numar[0]]=nr;
        }
        else
            if(imp[sir[i]])
            {
                while(!semn.empty() && imp[semn.top()]>=imp[sir[i]])
                {
                    numar[++numar[0]]=-care[semn.top()];
                    semn.pop();
                }
                semn.push(sir[i]);
            }
            else
                if(sir[i]=='(')
                   semn.push('(');
                else
                {
                    while(semn.top()!='(')
                    {
                        numar[++numar[0]]=-care[semn.top()];
                        semn.pop();
                    }
                    semn.pop();
                }

    while(!semn.empty())
    {
        numar[++numar[0]]=-care[semn.top()];
        semn.pop();
    }

    for(i=1;i<=numar[0];++i)
        if(numar[i]>=0)
            rez.push(numar[i]);
        else
        {
            int val1=rez.top();rez.pop();
            int val2=rez.top();rez.pop();
            switch(numar[i])
            {
            case -1:
                {
                    rez.push(val2+val1);
                    break;
                }
            case -2:
                {
                    rez.push(val2-val1);
                    break;
                }
            case -3:
                {
                    rez.push(val2*val1);
                    break;
                }
            case -4:
                {
                    rez.push(val2/val1);
                    break;
                }
            }
        }

    fout<<rez.top();

    return 0;
}