i have written a program for creating an infix tree for the given expression.
the program is working fine if we give the expression completlely binded with operators and operands but when we ignore the brackets we need to consider the priority of the operators nad build the tree.
i am not getting the idea how to do that.
i have tried with a pen and paper but my efforts are in vain.
any suggestions on how can i change my program so that it works for both the inputs.
you can have a look at my code.
Code:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "BST.h"
#define EMPTY 0
void push_exp(int item);
int pop_exp();
int is_stk_exp_empty();
void push_tree();
BST_t *pop_tree();
int is_stk_tree_empty();
BST_t * infixtree(char* infix);
struct stack_exp
{
int data[MAX];
int top;
};
struct stack_exp ex;
struct stack_tree
{
BST_t *nodes[100];
int top;
};
struct stack_tree tree;
int emptystacks()
{
ex.top =-1;
tree.top =-1;
}
void push_exp(int item)
{
++ex.top;
ex.data[ex.top]=item;
}
int pop_exp()
{
int ret =0;
if(ex.top != -1)
{
ret= ex.data[ex.top];
--ex.top;
}
return ret;
}
int is_stk_exp_empty()
{
if(ex.top == -1)
return 1;
else
return 0;
}
int isoperator(char e)
{
if(e == '+' || e == '-' || e == '*' || e == '/' || e == '%'|| e == '^')
return 1;
else
return 0;
}
BST_t *create_node(int n1)
{
BST_t *newnode;
newnode = (BST_t *)malloc(sizeof(newnode));
newnode->data=n1;
newnode->left=NULL;
newnode->right=NULL;
return newnode;
}
int isoper(char ch)
{
char op;
switch(ch)
{
case '+':
case '-':
case '/':
case '*':
case '^':
op =1;
break;
default:
op=0;
break;
}
return op;
}
BST_t * infixtree(char* infix)
{
char *i,*p;
char n1;
BST_t *temp,*r,*l,*root,*t;
i = &infix[0];
while(*i)
{
while(isblank(*i) && *i != '\0')
{
i++;
}
if( isdigit(*i) || isalpha(*i))
{
while( isdigit(*i) || isalpha(*i))
{
push_exp(*i);
i++;
}
}
if(isoper(*i))
{
push_exp(*i);
}
if( *i == '(' )
{
push_exp(*i);
}
if( *i == ')')
{
while( (n1 = pop_exp()) != '(')
{
if(isoperator(n1))
{
temp = create_node(n1);
t = pop_tree();
if(t)
temp->right = t;
}
else
{
r=create_node(n1);
push_tree(r);
}
}
l=pop_tree();
if(l){
temp->left=l;
root=temp;
push_tree(root);
}
}
i++;
}
return root;
}
void push_tree(BST_t *t)
{
tree.top++;
tree.nodes[tree.top]=(BST_t *)malloc(sizeof(BST_t));
tree.nodes[tree.top]=t;
}
BST_t *pop_tree()
{
if(tree.top > -1 )
return tree.nodes[tree.top--];
else
return NULL;
}
int is_stk_tree_empty()
{
if(tree.top == -1)
return 1;
else
return 0;
}
void inorder(BST_t * root)
{
if(root != NULL )
{
inorder(root->left);
printf("%c", root->data);
inorder(root->right);
}
}
int main()
{
char in1[70],in2[70],post[50],ch;
BST_t * root1, *root2;root1=root2=NULL;
int i=0;
printf(" Exp: \"( a + ( ( ( ( b * c ) ^ d ) / ( e + f ) ) * g) )\"\n");
strcpy(in1," ( a + ( ( ( ( b * c ) ^ d ) / ( e + f ) ) * g))"); '
emptystacks();
root1 = infixtree(in1);
inorder(root1);
printf("\n");
printf("Exp : \"a + b * c ^ d / ( e + f ) * g\" \n");
strcpy(in2,"a + b * c ^ d / ( e + f ) * g");
emptystacks();
root2 = infixtree(in2);
inorder(root2);
return 0;
}