-
-
Notifications
You must be signed in to change notification settings - Fork 46.6k
Update evaluate_postfix_notations.py #8758
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
005f9c5
4eb8123
7646a57
de04120
9a92b82
ecd9e74
3559a55
7f6a692
748eff5
816120b
9e6f36a
2779cd0
2bbac37
c4f050e
c3a7c67
29b28ec
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,32 +17,52 @@ def evaluate_postfix(postfix_notation: list) -> int: | |
9 | ||
>>> evaluate_postfix(["4", "13", "5", "/", "+"]) | ||
6 | ||
>>> evaluate_postfix(["2", "+"]) | ||
2 | ||
>>> evaluate_postfix(["5", "-"]) | ||
-5 | ||
>>> evaluate_postfix([]) | ||
0 | ||
""" | ||
if not postfix_notation: | ||
return 0 | ||
|
||
operations = {"+", "-", "*", "/"} | ||
unary_operations = {"+"} # Unary operator(s) | ||
|
||
stack: list[Any] = [] | ||
|
||
for token in postfix_notation: | ||
if token in operations: | ||
b, a = stack.pop(), stack.pop() | ||
if token == "+": | ||
stack.append(a + b) | ||
elif token == "-": | ||
stack.append(a - b) | ||
elif token == "*": | ||
stack.append(a * b) | ||
if token == "-": | ||
if len(stack) < 1: | ||
raise ValueError( | ||
"Invalid expression: insufficient operands for unary operator" | ||
) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doesn't fix the problem with unary negation operators. We want to support negation, not raise an error if it's present. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. made several changes, look into that. |
||
operand = stack.pop() | ||
stack.append(-operand) | ||
else: | ||
if a * b < 0 and a % b != 0: | ||
stack.append(a // b + 1) | ||
else: | ||
stack.append(a // b) | ||
if len(stack) < 2: | ||
raise ValueError( | ||
"Invalid expression: insufficient operands for binary operator" | ||
) | ||
b, a = stack.pop(), stack.pop() | ||
if token == "+": | ||
stack.append(a + b) | ||
elif token == "-": | ||
stack.append(a - b) | ||
elif token == "*": | ||
stack.append(a * b) | ||
elif token == "/": | ||
if b == 0: | ||
raise ValueError("Invalid expression: division by zero") | ||
stack.append(a / b) | ||
else: | ||
stack.append(int(token)) | ||
|
||
if len(stack) != 1: | ||
raise ValueError("Invalid expression: insufficient operators") | ||
|
||
return stack.pop() | ||
|
||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unary_operations
is not currently being used.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
now I have made several changes, kindly look into it.