Cod sursa(job #2615590)

Utilizator iliescualexiaIliescu Alexia iliescualexia Data 14 mai 2020 22:21:37
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.8 kb
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream fi("evaluare.in");
ofstream fo("evaluare.out");
struct nod{ char op[10];
            nod *st, *dr;
          };
char sir[100010],expr[100010][10],c;
int vectpri[100010], vp[100010],el,x,m,k; ///  prioritate k +10 (
                          ///                -10 )
                          ///                 +1    +
                          ///                 +1    -
                          ///                 +10   *
                          ///                 +10   /

nod *rad;

nod* creare_arb(int li, int ls)
{
  nod *q;
  int i, j, minim;
  minim = vectpri[ls];
  i = ls;
  for(j=ls; j>=li; j--)
  {
      if(vectpri[j] < minim)
      {
          minim = vectpri[j];
          i = j;
      }
  }
    q = new nod;
    strcpy(q->op,expr[i]);
    if(li == ls)
             q->st = q->dr = NULL;
    else
     { q->st=creare_arb(li,i-1);
       q->dr=creare_arb(i+1,ls);
     }
  return q;
}

void SDR(nod *q)
{
  if(q != NULL)
  {
    SDR(q->st);
    SDR(q->dr);
    if(q->op[0]>='0'&&q->op[0]<='9')
    {
        k=0;
        el=0;
        while(q->op[k]>='0'&&q->op[k]<='9')
        {
            x=q->op[k]-48;
            el=el*10+x;
            k++;
        }
        m++;
        vp[m]=el;
    }
    else
    {
        if(q->op[0]=='+')
        {
            x=vp[m]+vp[m-1];
            m--;
            vp[m]=x;
        }
        else
        {
            if(q->op[0]=='*')
            {
                x=vp[m]*vp[m-1];
                m--;
                vp[m]=x;
            }
            else
            {
                if(q->op[0]=='-')
                {
                    x=vp[m-1]-vp[m];
                    m--;
                    vp[m]=x;
                }
                else
                {

                    x=vp[m-1]/vp[m];
                    m--;
                    vp[m]=x;
                }
            }
        }
    }
  }
}
int main()
{ int i, j, k, n;
    k = 0; /// in k memorez prioritatile
    fi.get(sir,100010);  /// a*(b+c)-e/(a+d)+h
    n = strlen(sir);
    k=0;
    for(i=0; i<n; i++)
    {
        switch(sir[i])
        {
            case ')': {
                        k = k - 10;
                       };break;
            case '(': {
                        k = k + 10;
                       };break;
            case '+': {
                        vp[i] = k + 1;
                       };break;
            case '-': {
                        vp[i] = k + 1;
                       };break;
            case '*': {
                        vp[i] = k + 10;
                       };break;
            case '/': {
                        vp[i] = k + 10;
                       };break;
            default:  {
                        vp[i]=1000;
                        while(sir[i]>='0'&&sir[i]<='9')
                        {
                            i++;
                        }
                        i--;
                      }
        }
    }
    j=0;
    for(i=0; i<n; i++)
    {
        if(sir[i] !=')' && sir[i] !='(')
        {
            if(sir[i]>='0'&&sir[i]<='9')
            {
                k=0;
                vectpri[j] = vp[i];
                while(sir[i]>='0'&&sir[i]<='9'&&i<n)
                {
                    expr[j][k]=sir[i];
                    k++;
                    i++;
                }

                i--;
            }
            else
            {
                expr[j][0] = sir[i];
                vectpri[j] = vp[i];
            }
            j++;
        }

    }
    rad = creare_arb(0,j-1);
    m=0;
    SDR(rad);
    fo<<vp[1];
    fi.close();
    fo.close();
    return 0;
}