Cod sursa(job #2698970)

Utilizator TarceaIonutTarcea Tudor Ionut TarceaIonut Data 23 ianuarie 2021 12:44:00
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.76 kb
#include <bits/stdc++.h>

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

struct p
{
    char semn;
    int ordine;
};
array <p , 100005> f;

int ff[100005];
int nr_f;
char a[100005];
char fp[100005];
int nr_fp;
int n , k = 2;
int nr[100005] , nr_nr;

int find_nr(int &poz);
void creare_fp_nr();
int find_val();
int rez(int p1 , char oper , int p2);


int main()
{
    fin.getline(a , 100005);
    n = strlen(a);
    creare_fp_nr();
    fout << find_val();


    return 0;
}

int find_nr(int &poz)
{
    int nr = 0;
    while (a[poz] >= '0' && a[poz] <= '9')
    {
        nr = nr * 10 + a[poz] - 48;
        //a[poz] = ' ';
        poz++;
    }
    //a[poz-1] = 'a';
    return nr;
}

void creare_fp_nr()
{
    f[0].ordine = 0;
    int ordin;
    for (int i=0;i<n;i++)
    {
        if (a[i] == '(')
        {
            k += 2;
        }
        else if (a[i] == ')')
        {
            k -= 2;
        }
        else if (a[i] >= '0' && a[i] <= '9')
        {
            nr[nr_nr] = find_nr(i);
            i--;
            fp[nr_fp] = 'a';
            nr_nr++;
            nr_fp++;
        }
        else
        {
            if (a[i] == '-' || a[i] == '+')
            {
                ordin = k - 1;
            }
            if (a[i] == '*' || a[i] == '/')
            {
                ordin = k;
            }
            if (f[nr_f].ordine == 0 && nr_f == 0)
            {
                f[nr_f].ordine = ordin;
                f[nr_f].semn = a[i];
            }
            else
            {
                if (ordin < f[nr_f].ordine)
                {
                    while (ordin < f[nr_f].ordine && nr_f >= 0)
                    {
                        fp[nr_fp] = f[nr_f].semn;
                        nr_fp++;
                        nr_f--;
                    }

                }

                nr_f++;
                f[nr_f].ordine = ordin;
                f[nr_f].semn = a[i];

            }
        }
    }
    for (int i=nr_f;i>=0;i--)
    {
        fp[nr_fp] = f[i].semn;
        nr_fp++;
    }
}

int find_val()
{
    int poz_nr = 0 , poz_ff = 0;
    for (int i=0;i<=nr_fp;i++)
    {
        if (fp[i] == 'a')
        {
            ff[poz_ff] = nr[poz_nr];
            poz_nr++;
            poz_ff++;
        }
        else
        {
            poz_ff -= 2;
            ff[poz_ff] = rez(ff[poz_ff] , fp[i] , ff[poz_ff+1]);
            poz_ff++;
        }
    }
    return ff[0];
}

int rez(int p1 , char oper , int p2)
{
    if (oper == '-')
        return p1 - p2;
    if (oper == '+')
        return p1 + p2;
    if (oper == '/')
        return p1 / p2;
    if (oper == '*')
        return p1 * p2;
}