Infix To Postfix Conversion in Python using stack - Type-1
import sys
from collections import deque


# Utility function to return precedence of the given operator.
# Note that higher is the precedence, lower is its value
def prec(c):

	# Multiplication and division
	if c == '*' or c == '/':
		return 3

	# Addition and subtraction
	if c == '+' or c == '-':
		return 4

	# Bitwise AND
	if c == '&':
		return 8

	# Bitwise XOR (exclusive or)
	if c == '^':
		return 9

	# Bitwise OR (inclusive or)
	if c == '|':
		return 10

	# add more operators if needed
	return sys.maxsize		# for opening bracket '('


# Utility function to check if a given token is an operand
def isOperand(c):
	return ('a' <= c <= 'z') or ('A' <= c <= 'Z') or ('0' <= c <= '9')


# Function to convert an infix expression to a postfix expression.
# This function expects a valid infix expression
def infixToPostfix(infix):

	# base case
	if not infix or not len(infix):
		return True

	# create an empty stack for storing operators
	s = deque()

	# create a string to store the postfix expression
	postfix = ''

	# process the infix expression from left to right
	for c in infix:
		# Case 1. If the current token is an opening bracket '(', push it into
		# the stack
		if c == '(':
			s.append(c)

		# Case 2. If the current token is a closing bracket ')'
		elif c == ')':
			# pop tokens from the stack until the corresponding opening bracket '('
			# is removed. Append each operator at the end of the postfix expression
			while s[-1] != '(':
				postfix += s.pop()
			s.pop()

		# Case 3. If the current token is an operand, append it at the end of the
		# postfix expression
		elif isOperand(c):
			postfix += c

		# Case 4. If the current token is an operator
		else:
			# remove operators from the stack with higher or equal precedence
			# and append them at the end of the postfix expression
			while s and prec(c) >= prec(s[-1]):
				postfix += s.pop()

			# finally, push the current operator on top of the stack
			s.append(c)

	# append any remaining operators in the stack at the end of the postfix expression
	while s:
		postfix += s.pop()

	# return the postfix expression
	return postfix


if __name__ == '__main__':

	infix = 'A+B*C–D*E'
	postfix = infixToPostfix(infix)
	print(postfix)


Infix To Postfix Conversion in Python using stack - Type-2
class Conversion:

	# Constructor to initialize the class variables
	def __init__(self, capacity):
		self.top = -1
		self.capacity = capacity
		
		# This array is used a stack
		self.array = []
		
		# Precedence setting
		self.output = []
		self.precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3}

	# Check if the stack is empty
	def isEmpty(self):
		return True if self.top == -1 else False

	# Return the value of the top of the stack
	def peek(self):
		return self.array[-1]

	# Pop the element from the stack
	def pop(self):
		if not self.isEmpty():
			self.top -= 1
			return self.array.pop()
		else:
			return "$"

	# Push the element to the stack
	def push(self, op):
		self.top += 1
		self.array.append(op)

	# A utility function to check is the given character
	# is operand
	def isOperand(self, ch):
		return ch.isalpha()

	# Check if the precedence of operator is strictly
	# less than top of stack or not
	def notGreater(self, i):
		try:
			a = self.precedence[i]
			b = self.precedence[self.peek()]
			return True if a <= b else False
		except KeyError:
			return False

	# The main function that
	# converts given infix expression
	# to postfix expression
	def infixToPostfix(self, exp):

		# Iterate over the expression for conversion
		for i in exp:
			
			# If the character is an operand,
			# add it to output
			if self.isOperand(i):
				self.output.append(i)

			# If the character is an '(', push it to stack
			elif i == '(':
				self.push(i)

			# If the scanned character is an ')', pop and
			# output from the stack until and '(' is found
			elif i == ')':
				while((not self.isEmpty()) and
					self.peek() != '('):
					a = self.pop()
					self.output.append(a)
				if (not self.isEmpty() and self.peek() != '('):
					return -1
				else:
					self.pop()

			# An operator is encountered
			else:
				while(not self.isEmpty() and self.notGreater(i)):
					self.output.append(self.pop())
				self.push(i)

		# Pop all the operator from the stack
		while not self.isEmpty():
			self.output.append(self.pop())

		for ch in self.output:
			print(ch, end="")


# Driver code
if __name__ == '__main__':
	exp = "a+b*(c^d-e)^(f+g*h)-i"
	obj = Conversion(len(exp))

	# Function call
	obj.infixToPostfix(exp)



Free Web Hosting