mplement and use a Stack ADT to convert infix mathematical expressions to postfix, and then evaluate the postfix expressions. Input will be from a text file, and output will be written to a file. code example
Example 1: infix to postfix program in c++
/*https://github.com/Sudhanshu1304/Stack-Application*/
using namespace std;
class Stack{
private:
char A[5];
int Size;
public:
int top;
Stack(){
top=-1;
Size=sizeof(A)/sizeof(char);
}
bool IsFull(){
if(top==Size-1){
return true;
}
else{
return false;
}
}
bool IsEmpty(){
if(top==-1){
return true;
}
else{
return false;
}
}
char peek(){
return A[top];
}
void Push(char val){
if (IsFull()==false){
top++;
A[top]=val;
}
else{
cout<<"\nThe Stack is Full"<<endl;
}
}
char Pop(){
if(IsEmpty()==false){
char temp=A[top];
A[top]='0';
top--;
return temp;
}
else{
return '-1';
}
}
void Show_Stack(){
for(int i=0;i<top+1;i++){
cout<<A[i];
}
}
};
int Search(char A){
string CHAR[]={"([","{)","]}","+-","*/","^$"};
int Size=(sizeof(CHAR)/sizeof(string));
for(int i=0;i<Size;i++){
if(A==CHAR[i][0]){
if(i+i>=6){
return i+i;
}
else{
return i+i+0;
}
}
else if(CHAR[i][1]==A){
if(i+i>=6){
return i+i;
}
else{
return i+i+1;
}
}
}
return -1;
}
void Display(char ch,string vari, Stack &s){
int Size=s.top+1;
cout<<"\n "<<ch<<" ";
s.Show_Stack();
for(int i=0;i<10-Size;i++){
cout<<" ";
}
cout<<vari<<endl;
}
int main(){
Stack STACK;
char temp;
string exp;//"A+B*C";
cout<<"Enter Your Expression :";
cin>>exp;
string out="";
cout<<"\n\nExpression Stack Postfix\n"<<endl;
for(int i=0;i<exp.size();i++){
temp=exp[i];
int ab=Search(temp);
if (ab!=-1){
/* If We ENCOUNTER CLOSING BRACKETS*/
if(ab<=5 && ab>=3){
while(Search(STACK.peek())>2){
char val=STACK.Pop();
out=out+val;
Display(temp,out,STACK);
}
STACK.Pop();
Display(temp,out,STACK);
}
/* Search Precedence*/
else{
if (Search(temp)>=0 && Search(temp)<=2){
STACK.Push(temp);
Display(temp,out,STACK);
}
/* If TOP < Temp */
else if(Search(STACK.peek())<ab){
STACK.Push(temp);
Display(temp,out,STACK);
}
else{
/* if STACK= +,* and temp= + then we have to remove two times */
while(Search(STACK.peek())>=ab){
char val=STACK.Pop();
out=out+val;
Display(temp,out,STACK);
}
STACK.Push(temp);
Display(temp,out,STACK);
}
}
}
/* If an Alphabet */
else{
out=out+temp;
Display(temp,out,STACK);
}
}
while(STACK.IsEmpty()==false){
char val=STACK.Pop();
out=out+val;
Display(temp,out,STACK);
}
cout<<"\n\nFINAL STRING : "<<out<<endl;
}
Example 2: python postfix conversion
"""
Author : ITVoyagers (itvoyagers.in)
Date :31st October 2019
Description : Program to show use of stack in infix to postfix conversion using python.
"""
class infix_to_postfix:
precedence={'^':5,'*':4,'/':4,'+':3,'-':3,'(':2,')':1}
def __init__(self):
self.items=[]
self.size=-1
def push(self,value):
self.items.append(value)
self.size+=1
def pop(self):
if self.isempty():
return 0
else:
self.size-=1
return self.items.pop()
def isempty(self):
if(self.size==-1):
return True
else:
return False
def seek(self):
if self.isempty():
return false
else:
return self.items[self.size]
def isOperand(self,i):
if i in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
return True
else:
return False
def infixtopostfix (self,expr):
postfix=""
print('postfix expression after every iteration is:')
for i in expr:
if(len(expr)%2==0):
print("Incorrect infix expr")
return False
elif(self.isOperand(i)):
postfix +=i
elif(i in '+-*/^'):
while(len(self.items)and self.precedence[i]<=self.precedence[self.seek()]):
postfix+=self.pop()
self.push(i)
elif i is '(':
self.push(i)
elif i is ')':
o=self.pop()
while o!='(':
postfix +=o
o=self.pop()
print(postfix)
while len(self.items):
if(self.seek()=='('):
self.pop()
else:
postfix+=self.pop()
return postfix
s=infix_to_postfix()
expr=input('enter the expression ')
result=s.infixtopostfix(expr)
if (result!=False):
print("the postfix expr of :",expr,"is",result)