Cod sursa(job #805525)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 31 octombrie 2012 17:16:08
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
using namespace std;
#include<fstream>
#include<ctype.h>
#include<cstring>
#include<stdlib.h>
#include<cmath>
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char x[200001],polo[200001],st[200001],op[]="+-*/()",c;
int n,i,k,vf=-1,l,nr;
int y,st2[100001];

char pop()
{
if (vf>=0) return st[vf--];
return 0;
}

void push(char c)
{
st[++vf]=c;
}
int main()
{

 fin.getline(x,100000);
 n=strlen(x);

for(i=0;i<n;i++)
{
if(isdigit(x[i]))
 {
  while(isdigit(x[i]))
    {
    polo[k++]=x[i];
    i++;
    }
    polo[k++]='.';
 }
 switch (x[i])
 {
 case '(': push(x[i]);break;

 case ')': while((c=pop())!='(') polo[k++]=c;break;

 case '*': case '/':

 while((vf!=-1) && strchr("*/",st[vf]) )
    {
    polo[k++]=pop();
    }
 push(x[i]); break;

 case '+': case '-':

 while( st[vf]!='('&& (vf!=-1) )
 {
     polo[k++]=pop();
 }
 push(x[i]);

}
}

while((c=pop())!=0) polo[k++]=c;

polo[k++]=0;

 n=strlen(polo);
 l=-1;
 for(i=0;i<n;i++)
 {
    if(isdigit(polo[i]))
    {
    nr=atoi(polo+i);
    st2[++l]=nr;
    i=i+log10(nr)+1;
    }

  switch(polo[i])
  { case '*':st2[l-1]=st2[l-1]*st2[l--];break;
    case '+':st2[l-1]=st2[l-1]+st2[l--]; break;
    case '-':st2[l-1]=st2[l-1]-st2[l--]; break;
    case '/':st2[l-1]=st2[l-1]/st2[l--];break;
  }
 }
fout<<*st2;
return 0;
}