You are on page 1of 4

in2post311.

c 4/5/2011
/* Program : Inorder to postorder conversion and evaluation
* Date : 24-02-2011
* Files : in2post.c
* Author : Harsha.S
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
char * push(char *, char);
char * pop(char *, char *);
char getToken(char **);
char * verifytos(char *, char, char *, int *);
char * getall(char *, char *, int *);
int evaluate(char *);
int *push_int(int *, int);
int *pop_int(int *, int *);

char stack[MAX];
int stack_int[MAX];
int main(){
char inorder[MAX], postorder[MAX];
char *in, *po, *tos;
int r, result = 0;
char token, pri;
printf("Enter the inorder expression : ");
fgets(inorder, 99, stdin);
printf("Inorder : %s",inorder);
in = inorder;
po = postorder;

tos = &stack[1];
initlize_stack();

while(*in != '\n'){
token = getToken(&in);
if(token != -1 && token > 47 & token <58){
*po++ = token;
}
else if(token == '(')
tos = push(tos, '(');
else if(token == ')'){
r = 0;
while(!r){
tos = getall(tos, &pri, &r);
if(pri){
*po++ = pri;
}
}
}
else{
r = 0;
while(!r){
tos = verifytos(tos, token, &pri, &r);
if(pri){
*po++ = pri;
}
}
}

1
in2post311.c 4/5/2011
}

while(*tos){
char c;
tos = pop(tos, &c);
*po++ = c;
}
*po = '\0';

printf("Postorder : %s\n",postorder);
po = postorder;
initlize_stack();
result = evaluate(po);
printf("Result is %d\n",result);
}

char * push(char *t, char o){


if(t == stack+MAX-1){
printf("Stack Full\n");
exit(1);
}
t++;
*t = o;
return t;
}
char * pop(char *t, char *res){
if(t == &stack[1]){
printf("Stack Empty\n");
exit(1);
}
*res = *t;
*t = '\0';
t--;
return t;
}

char getToken(char **ptr){


char *p, d;
p = *ptr;
d = *p;
p++;
*ptr = p;
return d;
}

int priority(char d){


int x = -1;

switch(d){
case '(':
x = 0;
break;
case '+':
case '-':
x = 1;
break;
case '*':
case '/':
x = 2;
break;
}

2
in2post311.c 4/5/2011
return x;
}

int initlize_stack(){
int i;
for(i = 0; i < MAX; i++)
stack[i] = '\0';
}
char * verifytos(char *t, char tok, char *p, int *res){
while(!*res){
if(priority(*t) >= priority(tok)){
t = pop(t, p);
*res = 0;
return t;
}
else{
t = push(t, tok);
*p = '\0';
*res = 1;
return t;
}
}
}
char * getall(char *t, char *p, int *res){
while(*t != '('){
t = pop(t, p);
*res = 0;
return t;
}
t = pop(t, p);
*res = 1;
*p = '\0';
return t;
}
int evaluate(char *p){
char token = 1;
int oper1, oper2;
int res = 0, *tos;
tos = stack_int;

while(token != '\0'){
token = getToken(&p);
if(token != -1 && token > 47 && token < 58)
tos = push_int(tos, token-48);
else{
tos = pop_int(tos, &oper2);
tos = pop_int(tos, &oper1);
switch(token){
case '+':
res = oper1 + oper2;
tos = push_int(tos, res);
break;
case '-':
res = oper1 - oper2;
tos = push_int(tos, res);
break;

3
in2post311.c 4/5/2011
case '*':
res = oper1 * oper2;
tos = push_int(tos, res);
break;
case '/':
res = oper1 / oper2;
tos = push_int(tos, res);
break;
}
}
}
return res;
}

int* push_int(int *p, int d){

if(p == stack_int+MAX){
printf("Stack int full\n");
exit(1);
}
else{
p++;
*p = d;
}

return p;
}

int* pop_int(int *p, int *d){


if(p < stack_int){
printf("Stack int empty\n");
exit(1);
}
else{
*d = *p;
*p = '\0';
p--;
}

return p;
}

You might also like