0% found this document useful (0 votes)
110 views13 pages

Infix To Postfix

The document discusses C++ code for converting between infix, postfix, and prefix notations of mathematical expressions. It includes functions to: 1) Convert an infix expression to postfix notation by using a stack to evaluate operator precedence. 2) Convert a postfix expression to prefix notation by reversing the postfix string and using a stack. 3) Convert a prefix expression to postfix notation by using two stacks, one for operators and one for flags, to iteratively pop operators and append them to the output. 4) Additional supporting functions like checking if a character is an operator or operand.

Uploaded by

Hasan Raza
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
110 views13 pages

Infix To Postfix

The document discusses C++ code for converting between infix, postfix, and prefix notations of mathematical expressions. It includes functions to: 1) Convert an infix expression to postfix notation by using a stack to evaluate operator precedence. 2) Convert a postfix expression to prefix notation by reversing the postfix string and using a stack. 3) Convert a prefix expression to postfix notation by using two stacks, one for operators and one for flags, to iteratively pop operators and append them to the output. 4) Additional supporting functions like checking if a character is an operator or operand.

Uploaded by

Hasan Raza
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 13

Data Structure & Algorithms

Assignment 1
BS-SE-18
Section A
Name Waleed Qadeer
Roll no. 18094198-022
Submitted TO Prof.Bushra Fareed
Infix to Postfix
#include<iostream>

#include<stack>

#include<string>

using namespace std;

// Function to convert Infix expression to postfix

string InfixToPostfix(string expression);

// Function to verify whether an operator has higher precedence over other

int HasHigherPrecedence(char operator1, char operator2);

// Function to verify whether a character is operator symbol or not.

bool IsOperator(char C);

// Function to verify whether a character is alphanumeric chanaracter (letter or numeric digit) or not.

bool IsOperand(char C);

int main()

string expression;

cout<<"Enter Infix Expression \n";

getline(cin,expression);

string postfix = InfixToPostfix(expression);

cout<<"Output = "<<postfix<<"\n";

// Function to evaluate Postfix expression and return output

string InfixToPostfix(string expression)

// Declaring a Stack from Standard template library in C++.

stack<char> S;

string postfix = ""; // Initialize postfix as empty string.


for(int i = 0;i< expression.length();i++) {

// Scanning each character from left.

// If character is a delimitter, move on.

if(expression[i] == ' ' || expression[i] == ',') continue;

// If character is operator, pop two elements from stack, perform operation and push the result back.

else if(IsOperator(expression[i]))

while(!S.empty() && S.top() != '(' && HasHigherPrecedence(S.top(),expression[i]))

postfix+= S.top();

S.pop();

S.push(expression[i]);

// Else if character is an operand

else if(IsOperand(expression[i]))

postfix +=expression[i];

else if (expression[i] == '(')

S.push(expression[i]);

else if(expression[i] == ')')

while(!S.empty() && S.top() != '(') {

postfix += S.top();

S.pop();

S.pop();

while(!S.empty()) {
postfix += S.top();

S.pop();

return postfix;

// Function to verify whether a character is english letter or numeric digit.

// We are assuming in this solution that operand will be a single character

bool IsOperand(char C)

if(C >= '0' && C <= '9') return true;

if(C >= 'a' && C <= 'z') return true;

if(C >= 'A' && C <= 'Z') return true;

return false;

// Function to verify whether a character is operator symbol or not.

bool IsOperator(char C)

if(C == '+' || C == '-' || C == '*' || C == '/' || C== '$')

return true;

return false;

// Function to verify whether an operator is right associative or not.

int IsRightAssociative(char op)

if(op == '$') return true;

return false;

// Function to get weight of an operator. An operator with higher weight will have higher precedence.

int GetOperatorWeight(char op)

int weight = -1;

switch(op)
{

case '+':

case '-':

weight = 1;

case '*':

case '/':

weight = 2;

case '$':

weight = 3;

return weight;

// Function to perform an operation and return output.

int HasHigherPrecedence(char op1, char op2)

int op1Weight = GetOperatorWeight(op1);

int op2Weight = GetOperatorWeight(op2);

// If operators have equal precedence, return true if they are left associative.

// return false, if right associative.

// if operator is left-associative, left one should be given priority.

if(op1Weight == op2Weight)

if(IsRightAssociative(op1)) return false;

else return true;

return op1Weight > op2Weight ? true: false;

Postfix to Prefix
#include <iostream>

#include <cstring>

#include <stack>

#include <algorithm>

#define flag '#'

using namespace std;


bool isOperator(char c)

if(c=='+' || c=='-' || c=='*' || c=='/' || c=='^' || c=='$')

return true;

else

return false;

int main()

stack<char> stk;

char postfix[30], prefix[30];

int j=0,len;

cout<<"Input a postfix expression: ";

cin>>postfix;

len = strlen(postfix);

for(int i=len-1;i>=0;i--)

if(isOperator(postfix[i]))

stk.push(postfix[i]);

else

prefix[j++] = postfix[i];

while(!stk.empty() && stk.top()==flag)

stk.pop();

prefix[j++] = stk.top();

stk.pop();

stk.push(flag);

prefix[j] = 0;
reverse(prefix, prefix + len);

cout<<"The prefix expression is: "<<prefix;

return 0;

Prefix to Postfix
#include <iostream>

#include <fstream>

#include <string>

#include <stack>

#include <stdlib.h>

using namespace std;

bool isOperator(char symbol); //declaring function isOperator

int main()

ifstream myfile; //declaring streams

ofstream outfile;

myfile.open("Prefix.txt", ios::in); //opening streams

outfile.open("Postfix.txt", ios::out);

while (!myfile.eof()) //while not end of input file

stack<char> operators;

stack<char> flags;

string line;

string outputLine;

getline(myfile, line); //read the next line of file and store into ‘line’

for(int i=0; i < line.size(); i ++) //reiterate through ‘line’

char symbol = line [i];

if( isOperator(symbol)) //if the symbol is an operator

operators.push(symbol); //push operator on stack

flags.push(0); //push associated flag on stack and set to off


}

if((symbol != ' ') && !isOperator(symbol)) //then it’s a operand

outputLine += symbol; //append to output string

//strcat(outputLine, symbol);

//outputLine.append(symbol);

while(flags.top()) //while top flag is ON on stack

outputLine += operators.top() ; //append the associated op

//strcat(outputLine, operators.top());

//outputLine.append(operators.top());

operators.pop(); //remove operator from stack

flags.pop(); //remove flag from stack

flags.pop(); //set next flag to ON

flags.push(1);

}//end of for

if(!operators.empty() || (!flags.empty()) )

outfile << "SOMETHING WENT WRONG. Prob incorrect input" << endl;

else

outfile << "Prefix: " << line << endl;

outfile << "Postfix: " << outputLine << endl;

} //end of while eof

myfile.close(); //close streams

outfile.close();

}//end of main
bool isOperator(char symbol) //definition of isOperator

if( (symbol == '*') || (symbol == '+') || (symbol == '/') || (symbol == '-' ) )

return true;

else

return false;

Postfix to infix
#include<iostream>

#include<cstring>

using namespace std;

struct node

char data ;

node *next ;

};

class stack

private :

node *head;

public :

stack()

head = NULL;

void push(char a)

node * temp = new node();

temp ->data = a ;

temp -> next = head ;

head = temp ;
}

char pop()

node *temp = head ;

head = temp->next ;

char a = temp->data ;

delete temp;

return a;

char see_top()

if(is_empty())

return '0' ;

node * temp = head ;

return (temp->data);

int is_empty()

if(head == NULL)

return 1;

else

return 0 ;

};

int is_digit(char a)

if(a >= '0' && a<= '9')

return 1;

else

return 0;

}
int is_operand(char a)

switch(a)

case '+' :

case '-' :

case '*' :

case '/' : return 1;

default : return 0;

void reverse(char a[] , int l)

int i=0;

stack b ;

for(int j=0;j<l;j++)

b.push(a[j]);

while(!b.is_empty())

a[i++]=b.pop();

return ;

int main()

int i , l , j=0;

char exp[100] , infix[100];

stack s ;

cout << "Enter a postfix expression : ";

cin.getline(exp,100);
l=strlen(exp);

reverse(exp,l);

for(i=0;i<l;i++)

if(is_digit(exp[i]))

infix[j++] = exp[i];

if(i==l-1)

break ;

infix[j++] = s.pop() ;

else

s.push(exp[i]);

while(!s.is_empty())

infix[j++] =s.pop();

reverse(infix,l);

cout << "\nInfix is : " ;

for(i=0;i<l;i++)

cout << infix[i] ;

cout << endl;

return 0;

Recursion
1. #include <iostream>
2. using namespace std;
3.
4. int factorial(int);
5.
6. int main()
7. {
8. int n;
9. cout<<"Enter a number to find factorial: ";
10. cin >> n;
11. cout << "Factorial of " << n <<" = " << factorial(n);
12. return 0;
13. }
14.
15. int factorial(int n)
16. {
17. if (n > 1)
18. {
19. return n*factorial(n-1);
20. }
21. else
22. {
23. return 1;
24. }
25. }

You might also like