Implement stack as an abstract data type using singly linked list and use this ADT for conversion of infix expression to postfix, prefix and evaluation of postfix and prefix expression.
#include<stdlib.h>
#include<iostream>
#include<string.h>
#define max 30
using namespace std;
struct node
{
char data;
struct node *next;
};
class stack
{
node *top;
char x;
public:
stack()
{
top= NULL;
}
int empty()
{
if(top==NULL)
{
return(1);
}
else
{
return(0);
}
}
void push(char x)
{
node *p;
p=new node;
p->data=x;
p->next=top;
top=p;
}
char pop()
{
if(!empty())
{
node *p;
p=new node;
p=top;
top=top->next;
x=p->data;
delete p;
return(x);
}
else
{
cout<<"stack is empty"<<endl;
return(0);
}
}
char pop1()
{
if(!empty())
{
node *p;
p=new node;
p=top;
//top=top->next;
x=p->data;
//delete p;
return(x);
}
else
{
cout<<"stack is empty"<<endl;
return(0);
}
}
};
int precedence(char x);
void infix_to_prefix(char infix[],char prefix[]);
void infix_to_postfix(char infix[],char postfix[]);
void eval_prefix(char prefix[]);
void eval_postfix(char postfix[]);
int evaluate(char x,int op1,int op2);
int main()
{
char infix[30],prefix[30],postfix[30];
int op;
do{
cout<<"nnnMenu:: n1)Infix to Prefix with Evaluation n2)Infix to Postfix with Evaluation n3)Quit nEnter your choice:: ";
cin>>op;
switch(op)
{
case 1:
cout<<"nEnter the infix expression::"<<endl;
cin>>infix;
infix_to_prefix(infix,prefix);
cout<<"nPrefix expression is "<<prefix<<endl;
cout<<"nnEvaluation of Prefix expression";
eval_prefix(prefix);
break;
case 2:
cout<<"nEnter the infix expression::"<<endl;
cin>>infix;
infix_to_postfix(infix,postfix);
cout<<"nPostfix expression is "<<postfix<<endl;
cout<<"nnEvaluation of Postfix expression";
eval_postfix(postfix);
break;
}
}while(op!=3);
return 0;
}
void infix_to_prefix(char infix[],char prefix[])
{
int i,j;
char temp,in1[30];
cout<<"nn After step 1...nEntered infix is...";
for(i=0;i<=strlen(infix)-1;i++)
{
cout<<infix[i];
}
for(i=strlen(infix)-1,j=0;i>=0;i--,j++)
in1[j]=infix[i];
in1[j]='