-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInfixToPostfix.py
More file actions
84 lines (70 loc) · 3.46 KB
/
InfixToPostfix.py
File metadata and controls
84 lines (70 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
############################
# Author: Hemant Tripathi #
###########################
class InfixToPostfix:
def __init__(self):
self.opstack = []
self.postfixexp = '';
def PushToOpStack(self, operator):
print('Pushing Operator '+operator+' into OpStack');
if operator == ')':#push all operators to postfix expression until ( will not found
print('Add to Postfix expression until ( will not meet.')
operator = self.PopFromOpStack();
while operator != '(':
print('Operator pushing into OpStack: ', operator)
self.AddToPostfixExp(operator)
operator = self.PopFromOpStack();
else:
print('Appending operator to opstack and check precedence.')
self.opstack.append(operator)
if(len(self.opstack) > 1):
precedence = self.CheckPrecedence(self.opstack[len(self.opstack)-1], self.opstack[len(self.opstack)-2])
if precedence == True:
poppedElement = self.PopFromOpStack()
self.AddToPostfixExp(self.PopFromOpStack())
self.PushToOpStack(poppedElement)
def AddToPostfixExp(self, element):
print('Adding element '+element+' to Postfix Expression')
self.postfixexp = self.postfixexp + element;
def PopFromOpStack(self):
poppedElement = self.opstack[len(self.opstack)-1]
print('Popping top element '+poppedElement+' from OpStack')
self.opstack.pop()
return poppedElement
def CheckPrecedence(self, optop, nextop): #check if precedence of op1 is greater then nexttop element, return false.
if optop == '(' or optop == '$' or optop == '^':
return False #false means, don't do any operation. Its a normal case.
elif (optop == '*' or optop == '/') and (nextop == "*" or nextop == '/' or nextop == '$' or nextop == '^'):
return True #true means, top precedence is lower or equal to next top element. Now pop it and append to postfix expression
elif (optop == '+' or optop == '-') and (nextop == '+' or nextop == '-' or nextop == '*' or nextop == '/' or nextop == '$'):
return True
else:
return False
def split(self, expression):
return list(expression)
def isOpStackEmpty(self):
if len(self.opstack) > 0:
return False
else:
return True
def main():
infixToPostfixConverter = InfixToPostfix()
print('----------------Infix to Post Conversion start -------------------')
expression = input("Enter an Infix expression: ")
tokens = infixToPostfixConverter.split(expression)
result = True;
for token in tokens:
print('next token: ', token)
if token.isalpha() or token.isdigit():
print(token + ' is operand. Pushing to PostfixExpression')
infixToPostfixConverter.AddToPostfixExp(token)
else:
print(token + ' is operator. Pushing to OpStack')
infixToPostfixConverter.PushToOpStack(token)
print('Now pop all the OpStack operators into the postfix expression')
while (infixToPostfixConverter.isOpStackEmpty() == False):
infixToPostfixConverter.AddToPostfixExp(infixToPostfixConverter.PopFromOpStack())
print('===================Final Postfix Expression=======================')
print('Postfix Expression = ', infixToPostfixConverter.postfixexp)
if __name__ == "__main__":
main()