Thread: PROBLEM W/ EVALUATE....plz help me!

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User
    Join Date
    Mar 2010
    Posts
    4

    PROBLEM W/ EVALUATE....plz help me!

    Code:
    #include <stdio.h>
    #include <ctype.h>
    
    #define MAX 50
    #define EMPTY -1
    
    struct stack
    {
    		  int data[MAX];
    		  int top;
    };
    
    
    int isempty(struct stack *s)
    {
    		  return (s->top == EMPTY) ? 1 : 0;
    }
    
    void emptystack(struct stack* s)
    {
    		  s->top = EMPTY;
    }
    
    void push(struct stack* s,int item)
    {
    		  if(s->top == (MAX-1))
    		  {
    					 printf("\nSTACK FULL");
    		  }
    		  else
    		  {
    					 ++s->top;
    					 s->data[s->top]=item;
    		  }
    }
    
    int pop(struct stack* s)
    {
    		  int ret=EMPTY;
    		  if(s->top == EMPTY)
    					 printf("\nSTACK EMPTY");
    		  else
    		  {
    					 ret= s->data[s->top];
    					 --s->top;
    		  }
    		  return ret;
    }
    
    void display(struct stack s)
    {
    		  while(s.top != EMPTY)
    		  {
    					 printf("\n%d",s.data[s.top]);
    					 s.top--;
    		  }
    }
    
    
    int isoperator(char e)
    {
    		  if(e == '+' || e == '-' || e == '*' || e == '/' || e == '%')
    					 return 1;
    		  else
    					 return 0;
    }
    
    
    int priority(char e)
    {
    		  int pri = 0;
    
    		  if(e == '*' || e == '/' || e =='%')
    					 pri = 2;
    		  else
    		  {
    					 if(e == '+' || e == '-')
    								pri = 1;
    		  }
    		  return pri;
    }
    
    int evaluate(char *postfix)
    {
    		  char *p;
    		  struct stack stk;
    		  int op1,op2,result;
    
    		  emptystack(&stk);
    		  p = &postfix[0];
    
    		  while(*p != '\0')
    		  {
    			  /* removes tabs and spaces */
    					 while(*p == ' ' || *p == '\t')
    					 {
    								p++;
    					 }
    			 /* if is digit */
    					 if(isdigit(*p))
    					 {
    								push(&stk,*p - 48);
    					 }
    					 else
    					 {
    						 /* it is an operator */
    								op2 = pop(&stk);
    								op1 = pop(&stk);
    
    								switch(*p)
    								{
    										  case '+':
    													 result = op1 + op2;
    													 break;
    
    										  case '-':
    													 result = op1 - op2;
    													 break;
    
    										  case '/':
    													 result = op1 / op2;
    													 break;
    
    										  case '*':
    													 result = op1 * op2;
    													 break;
    
    										  case '%':
    													 result = op1 % op2;
    													 break;
    
    										  default:
    													 printf("\nInvalid Operator");
    													return 0;
    								}
    								push(&stk,result);
    					 }
    					 p++;
    		  }
    		  result = pop(&stk);
    		  return result;
    }
    
    
    void infix2postfix(char* infix, char * postfix, int insertspace)
    {
    		  char *i,*p;
    		  struct stack X;
    		  char n1;
    		  emptystack(&X);
    		  i = &infix[0];
    		  p = &postfix[0];
    
    		  while(*i)
    		  {
    					 while(*i == ' ' || *i == '\t')
    					 {
    								i++;
    					 }
    
    					 if( isdigit(*i) || isalpha(*i) )
    					 {
    								while( isdigit(*i) || isalpha(*i))
    								{
    										  *p = *i;
    										  p++;
    										  i++;
    								}
    								/*SPACE CODE*/
    								if(insertspace)
    								{
    										  *p = ' ';
    										  p++;
    								}
    								/*END SPACE CODE*/
    					 }
    
    					 if( *i == '(' )
    					 {
    								push(&X,*i);
    								i++;
    					 }
    
    					 if( *i == ')')
    					 {
    								n1 = pop(&X);
    								while( n1 != '(' )
    								{
    										  *p = n1;
    										  p++;
    										  /*SPACE CODE*/
    										  if(insertspace)
    										  {
    													 *p = ' ';
    													 p++;
    										  }
    										  /*END SPACE CODE*/
    										  n1 = pop(&X);
    								}
    								i++;
    					 }
    
    					 if( isoperator(*i) )
    					 {
    								if(isempty(&X))
    										  push(&X,*i);
    								else
    								{
    										  n1 = pop(&X);
    										  while(priority(n1) >= priority(*i))
    										  {
    													 *p = n1;
    													 p++;
    													 /*SPACE CODE*/
    													 if(insertspace)
    													 {
    																*p = ' ';
    																p++;
    													 }
    													 /*END SPACE CODE*/
    													 n1 = pop(&X);
    										  }
    										  push(&X,n1);
    										  push(&X,*i);
    								}
    								i++;
    					 }
    		  }
    		  while(!isempty(&X))
    		  {
    					 n1 = pop(&X);
    					 *p = n1;
    					 p++;
    					 /*SPACE CODE*/
    					 if(insertspace)
    					 {
    								*p = ' ';
    								p++;
    					 }
    					 /*END SPACE CODE*/
    		  }
    		  *p = '\0';
    }
    
    int main(void)
    {
    	char infix[MAX], postfix[MAX], result[MAX];
    	printf("Enter expression: ");
    	fflush(stdin);
    	gets(infix);
    	infix2postfix(&infix[0],&postfix[0],1);
    	printf("\nPostfix expression is: %s",&postfix[0]);
    	result[0]=postfix[0];
    	printf("\n %s = %d.",&infix[0],evaluate(&result[0]));
    	return 0;
    }
    Last edited by vIp3rS; 03-03-2010 at 01:03 PM.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. plz help me with run problem
    By onlinegeek in forum C++ Programming
    Replies: 9
    Last Post: 12-14-2005, 11:46 PM
  2. Replies: 5
    Last Post: 11-07-2005, 11:34 PM
  3. compiling problem! plz help!
    By aaroroge in forum C++ Programming
    Replies: 9
    Last Post: 10-24-2005, 09:57 PM
  4. searching problem
    By DaMenge in forum C Programming
    Replies: 9
    Last Post: 09-12-2005, 01:04 AM
  5. half ADT (nested struct) problem...
    By CyC|OpS in forum C Programming
    Replies: 1
    Last Post: 10-26-2002, 08:37 AM