Professional Documents
Culture Documents
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);
}
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;
}
if(p == stack_int+MAX){
printf("Stack int full\n");
exit(1);
}
else{
p++;
*p = d;
}
return p;
}
return p;
}