Cod sursa(job #2250991)

Utilizator nicuvladNicu Vlad nicuvlad Data 30 septembrie 2018 22:33:22
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<fstream>
#define N 100000
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char c,semn[N], st[N];
int i,n,k,nr,gasitnr,fp[N];
long long steval[100];

int main()
{

  while(fin>>c)
  {
    if(c>='0'&&c<='9')
    {
      gasitnr=1;
      nr=nr*10+(c-'0');
    }
    else
    {
      if(gasitnr)
      {
        fp[++n]=nr;
        nr=0;
        gasitnr=0;
      }

      if(c=='(' ||c=='+'||c=='-'||c=='*'||c=='/')
      {
        st[++k]=c;
        if(st[k]=='+'||st[k]=='-')
        {
          while(st[k-1]=='+'||st[k-1]=='-'|| st[k-1]=='*'|| st[k-1]=='/')
          {
            semn[++n]=st[k-1];
            st[k-1]=st[k];
            k--;
          }
        }
        else
          if(st[k]=='*'||st[k]=='/')
        {

          while(st[k-1]=='*'||st[k-1]=='/')
          {
            semn[++n]=st[k-1];
            st[k-1]=st[k];
            k--;
          }
        }
      }
      else
        if(c==')')
      {
          while(st[k]!='(')
          {
            semn[++n]=st[k];
            k--;
          }
          k--;
      }
    }
  }

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

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

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