MIT-Curricular/DS/C/Lab/Week11/expression.c

126 lines
2.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#include<ctype.h>
#include<string.h>
#define MAX 100
typedef struct TNode *Tptr;
typedef struct TNode
{
char data;
Tptr leftchild;
Tptr rightchild;
}TNode;
///*
//Create nodes in the tree
Tptr createNode(char val)
{
Tptr temp =(Tptr)malloc(sizeof(TNode));
temp->data = val;
temp->leftchild = temp->rightchild = NULL;
return temp;
}
//*/
Tptr stack[MAX];
int top=-1;
int i;
//check if stack is empty
bool isEmpty()
{
return top==-1;
}
//check if stack is full
bool isFull()
{
return top==MAX -1;
}
//push element onto stack
void Push(Tptr e)
{
if(isFull())
{
return;
}
stack[++top]=e;
}
//pop element from stack
Tptr Pop()
{
Tptr popped=createNode('\0');
if(isEmpty())
{
free(popped);
}
else
{
popped=stack[top--];
}
return popped;
}
//check if character is operator
bool isOperator(char ch)
{
bool ret=false;
if(ch=='*' || ch=='/' || ch=='+' || ch=='-' || ch=='^' )
{
ret = true;
}
return ret;
}
Tptr createExpression(char* postfix)
{
int i;
int plen =strlen(postfix);
char cc;
for(i=0;i<plen;i++)
{
cc = postfix[i];
if(isalnum(cc))
{
Tptr node = createNode(cc);
Push(node);
}
else if(isOperator(cc))
{
Tptr node = createNode(cc);
node->rightchild = Pop();
node->leftchild = Pop();
Push(node);
}
}
return stack[top];
}
void inOrderTraversal(Tptr root)
{
if (root != NULL)
{
inOrderTraversal(root->leftchild);
printf("%c ", root->data);
inOrderTraversal(root->rightchild);
}
}
int main()
{
char postfix[] = "ab*cd/-";
Tptr expressionTree = createExpression(postfix);
if (expressionTree != NULL)
{
printf("In-Order Traversal of the Expression Tree: ");
inOrderTraversal(expressionTree);
printf("\n");
}
return 0;
}