Cod sursa(job #2734312)

Utilizator Marius16Pantea Marius Nicusor Marius16 Data 31 martie 2021 18:13:58
Problema Evaluarea unei expresii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char c,semn[1000000],st[10000];
int i,n,k,nr,gasitnr,fp[100000];
long long stiv[100];
int main()
{
    while(f>>c)
    {
        if(c>='0' && c<='9')
            { gasitnr=1; nr=nr*10+(c-48); }
           else
           {
               if(gasitnr)
               {
                   n++;
                   fp[n]=nr;
                   nr=0;
                   gasitnr=0;
               }
               if(c=='(' || c=='+' || c=='-' || c=='/' || c=='*')
               {
                   k++;
                   st[k]=c;
                   if(st[k]=='+' || st[k]=='-')
                   {
                       while(st[k-1]=='+' || st[k-1]=='-' || st[k-1]=='*' || st[k-1]=='/')
                       {
                           n++;
                           semn[n]=st[k-1];
                           st[k-1]=st[k];
                           k--;
                       }
                   }
                 else
                    if(st[k]=='*' || st[k]=='/')
                    {
                        while(st[k-1]=='*' || st[k-1]=='/')
                        {
                            n++;
                            semn[n]=st[k-1];
                            st[k-1]=st[k];
                            k--;
                        }
                    }
              }
           else
            if(c==')')
           {
               while(st[k]!='(')
               {
                   n++;
                   semn[n]=st[k];
                   k--;
               }
             k--;
           }


        }
    }
    if(gasitnr)
    {
      n++;
      fp[n]=nr;
      nr=0;
      gasitnr=0;

    }
    while(k)
    {
        n++;
        semn[n]=st[k];
    }

    k=0;
    for(int i=1; i<=n; i++)
    {
        if(semn[i]!='+' && semn[i]!='-' && semn[i]!='*' && semn[i]!='/')
        {
            k++;
            stiv[k]=fp[i];
        }
        else
        {
            switch(semn[i])
            {
                case '+': stiv[k-1]=stiv[k-1]+stiv[k]; break;
                case '-': stiv[k-1]=stiv[k-1]-stiv[k]; break;
                case '*': stiv[k-1]=stiv[k-1]*stiv[k]; break;
                case '/': stiv[k-1]=stiv[k-1]/stiv[k]; break;
            }
          k--;
        }

    }

    g<<stiv[1];
    g.close();
    f.close();
    return 0;
}