Cod sursa(job #145994)

Utilizator floringh06Florin Ghesu floringh06 Data 29 februarie 2008 22:39:41
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
using namespace std;

#define nmax 200005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

#include<stdio.h>
#include<fstream>
#include<string.h>

char c,d[nmax],p[nmax],q[nmax];
int ind,n,vf;
int stack[nmax],top;

void qin(char c) { q[vf]=c; vf++; }

inline char qout() { vf--; return q[vf]; }

inline int isempty() { if (vf==0) return 1; else return 0; }

void stin(int c) { stack[top]=c; top++; }

void read_input(void)
{
     gets (d);
     n = strlen (d) - 1;     
}

void write_output(void)
{
  printf("%d",stack[0]); printf("\n");
}

void interpret(void)
{
   char s[20];
   int i,j,k;
   for (i=0; i<=ind; i++) {
    if (p[i]>=48 && p[i]<=57)
     {
       memset(s,0,20); j=0;
       while (p[i]>=48 && p[i]<=57)
        {
         s[j]=p[i]; j++; i++;
        }
       k=atoi(s);
       stin(k);
     } 
    if (p[i]=='+')
     {
       k=stack[top-1] + stack[top-2];
       top-=2;  stin(k);
     }
    if (p[i]=='-')
     {
       k=stack[top-2] - stack[top-1];
       top-=2;  stin(k);
     }
    if (p[i]=='*')
     {
       k=stack[top-1] * stack[top-2];
       top-=2;  stin(k);
     }
    if (p[i]=='/')
     {
       k=stack[top-2] / stack[top-1];
       top-=2;  stin(k);
     } 
   }               
}

void solve(void)
{
     int i;
     char c;
     for (i=0; i<=n; i++)
      {
    	if (d[i]>=48 && d[i]<=57)
         {
	      while (d[i]>=48 && d[i]<=57) { p[ind]=d[i]; ind++; i++; }
	      p[ind]='.'; ind++;
	     }
	    if (d[i]=='(') qin('(');
	    if (d[i]==')')
	     while (!isempty())
	      {
	       c=qout();
	       if (c!='(') { p[ind]=c; ind++; }
	       else break;
	      }
	     if (d[i]=='+' || d[i]=='-')
        	{
	         while (!isempty())
	          {
	           if (q[vf-1]=='(') break;
	           c=qout(); p[ind]=c; ind++;
	          }
	         qin(d[i]);
         	}
     	 if (d[i]=='*' || d[i]=='/')
        	{
	         while (!isempty())
	          {
	           if (q[vf-1]=='(') break;
	           if (q[vf-1]=='+' || q[vf-1]=='-') break;
	           c=qout(); p[ind]=c; ind++;
	          }
	         qin(d[i]);
         	}
      }
 while (isempty()==0) { p[ind]=qout(); ind++; }
 ind--; interpret();
}

int main()
{
  freopen ("evaluare.in", "r", stdin);
  freopen ("evaluare.out", "w", stdout);  
  read_input();  solve();  write_output();
  return 0;
}