Skip to content

Commit 2186a69

Browse files
prefix & postfix evaluation
1 parent df0690c commit 2186a69

File tree

2 files changed

+154
-0
lines changed

2 files changed

+154
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from Stack import Stack
2+
3+
4+
def is_operator(expr):
5+
'''
6+
Checks if a given expression is operator
7+
:param expr: Input expression
8+
:return: True if the expression is an operator, else False
9+
'''
10+
if expr == '+' or expr == '-' or expr == '*' or expr == '/':
11+
return True
12+
return False
13+
14+
15+
def is_operand(expr):
16+
'''
17+
Checks if a given expression is digit or not
18+
:param expr: Input expression
19+
:return: True if the expression is a digit, else False
20+
'''
21+
if expr.isdigit():
22+
return True
23+
else:
24+
return False
25+
26+
27+
def perform(operator, op1, op2):
28+
'''
29+
Performs arithmetic operation on the given operands
30+
:param operator: Arithmetic operator
31+
:param op1: Operand 1
32+
:param op2: Operand 2
33+
:return: Result of arithmetic operation on operands
34+
'''
35+
if operator == '+':
36+
return op1 + op2
37+
elif operator == '-':
38+
return op1 - op2
39+
elif operator == '*':
40+
return op1 * op2
41+
elif operator == '/':
42+
return op1 / op2
43+
else:
44+
print("Invalid Operation")
45+
return -1
46+
47+
48+
def evaluate_postfix_expr(postfix_expr):
49+
'''
50+
Evaluates a postfix expression using stack
51+
:param postfix_expr: Postfix expression
52+
:return: evaluated result
53+
'''
54+
stack = Stack()
55+
n = len(postfix_expr)
56+
57+
for i in range(n):
58+
if is_operand(postfix_expr[i]):
59+
stack.push(int(postfix_expr[i]))
60+
elif is_operator(postfix_expr[i]):
61+
op2 = stack.peek()
62+
stack.pop()
63+
op1 = stack.peek()
64+
stack.pop()
65+
result = perform(postfix_expr[i], op1, op2)
66+
stack.push(result)
67+
return stack.peek()
68+
69+
70+
def main():
71+
postfix_expr = "2,3,*,5,4,*,+,9,-"
72+
postfix_expr = postfix_expr.split(',')
73+
print(evaluate_postfix_expr(postfix_expr))
74+
75+
76+
if __name__ == '__main__':
77+
main()
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from Stack import Stack
2+
3+
4+
def is_operator(expr):
5+
'''
6+
Checks if a given expression is operator
7+
:param expr: Input expression
8+
:return: True if the expression is an operator, else False
9+
'''
10+
if expr == '+' or expr == '-' or expr == '*' or expr == '/':
11+
return True
12+
return False
13+
14+
15+
def is_operand(expr):
16+
'''
17+
Checks if a given expression is digit or not
18+
:param expr: Input expression
19+
:return: True if the expression is a digit, else False
20+
'''
21+
if expr.isdigit():
22+
return True
23+
else:
24+
return False
25+
26+
27+
def perform(operator, op1, op2):
28+
'''
29+
Performs arithmetic operation on the given operands
30+
:param operator: Arithmetic operator
31+
:param op1: Operand 1
32+
:param op2: Operand 2
33+
:return: Result of arithmetic operation on operands
34+
'''
35+
if operator == '+':
36+
return op1 + op2
37+
elif operator == '-':
38+
return op1 - op2
39+
elif operator == '*':
40+
return op1 * op2
41+
elif operator == '/':
42+
return op1 / op2
43+
else:
44+
print("Invalid Operation")
45+
return -1
46+
47+
48+
def evaluate_prefix_expr(prefix_expr):
49+
'''
50+
Evaluates a postfix expression using stack
51+
:param postfix_expr: Postfix expression
52+
:return: evaluated result
53+
'''
54+
stack = Stack()
55+
n = len(prefix_expr)
56+
57+
for i in range(n-1, -1, -1):
58+
if is_operand(prefix_expr[i]):
59+
stack.push(int(prefix_expr[i]))
60+
elif is_operator(prefix_expr[i]):
61+
op1 = stack.peek()
62+
stack.pop()
63+
op2 = stack.peek()
64+
stack.pop()
65+
result = perform(prefix_expr[i], op1, op2)
66+
stack.push(result)
67+
return stack.peek()
68+
69+
70+
def main():
71+
postfix_expr = "-,+,*,2,3,*,5,4,9"
72+
postfix_expr = postfix_expr.split(',')
73+
print(evaluate_prefix_expr(postfix_expr))
74+
75+
76+
if __name__ == '__main__':
77+
main()

0 commit comments

Comments
 (0)