Cod sursa(job #2615375)

Utilizator dogaru_roxanaDogaru Roxana dogaru_roxana Data 14 mai 2020 15:23:21
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.28 kb
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;

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

int vp[100005], n, aux, st[50005], rez;
char s[100005];

struct ex
{
    char op[15];
}e[100005];

struct nod
{
    char op[15];
    nod *st, *dr;
};

nod *rad;

void creare (nod *&q, int li, int ls)
{
    int mini, poz, i;

    mini=vp[ls];
    poz=ls;

    for (i=ls-1; i>=li; i--)
    {
        if (vp[i]<mini)
        {
            mini=vp[i];
            poz=i;
        }
    }

    q=new nod;
    strcpy(q->op, e[poz].op); ///introduc nodul de pe pozitia poz in arbore

    if (li==ls)
    {
        q->st=q->dr=NULL;
    }
    else
    {
        creare(q->st, li, poz-1);
        creare(q->dr, poz+1, ls);
    }
}

void SDR (nod *q)
{
    if (q!=NULL)
    {
        SDR(q->st);
        SDR(q->dr);
        strcpy(e[aux].op, q->op); ///copiez in e[] expresia in forma poloneza
        aux++;
    }
}

int main()
{
    int i, k, nr, z, niv;

    fin.get(s, 100005);
    n=strlen(s);

    k=0;
    nr=0;

    for (i=0; i<n; i++)
    {
        switch(s[i])
        {
            case '(': {
                        k=k+10;
                      }; break;

            case ')': {
                        k=k-10;
                      }; break;

            case '+': {
                        vp[nr]=k+1;
                        e[nr].op[0]=s[i];
                        nr++;
                      }; break;

            case '-': {
                        vp[nr]=k+1;
                        e[nr].op[0]=s[i];
                        nr++;
                      }; break;

            case '*': {
                        vp[nr]=k+10;
                        e[nr].op[0]=s[i];
                        nr++;
                      }; break;

            case '/': {
                        vp[nr]=k+10;
                        e[nr].op[0]=s[i];
                        nr++;
                      }; break;

            default : {
                        z=0;
                        while (s[i]>='0' && s[i]<='9')
                        {
                            e[nr].op[z]=s[i];
                            z++;
                            i++;
                        }
                        vp[nr]=1000;
                        nr++;
                        i--;
                      }; break;
        }
    }

    creare(rad, 0, nr-1);
    SDR(rad);

    niv=0;
    rez=0;

    for (i=0; i<aux; i++)
    {
        if (e[i].op[0]>='0' && e[i].op[0]<='9')
        {
            st[niv]=atoi(e[i].op);
            niv++;
        }
        else
        {
            niv--;
            if (e[i].op[0]=='+')
                rez=st[niv-1]+st[niv];
            else
            {
                if (e[i].op[0]=='-')
                    rez=st[niv-1]-st[niv];
                else
                {
                    if (e[i].op[0]=='*')
                        rez=st[niv-1]*st[niv];
                    else
                        rez=st[niv-1]/st[niv];
                }
            }

            niv--;
            st[niv]=rez;
            niv++;
        }
    }
    fout<<st[0];

    fin.close();
    fout.close();
    return 0;
}