From 0625862bbe63ee4d957240b97c40445caa2632c4 Mon Sep 17 00:00:00 2001 From: Arnav Jagia Date: Sun, 15 Oct 2023 04:20:53 +0530 Subject: [PATCH 1/2] Added postfix-prefix conversion --- DIRECTORY.md | 1 + .../stacks/postfix_to_prefix_conversion.py | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 data_structures/stacks/postfix_to_prefix_conversion.py diff --git a/DIRECTORY.md b/DIRECTORY.md index 2c6000c94ed4..ea2bd06b29c6 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -257,6 +257,7 @@ * [Dijkstras Two Stack Algorithm](data_structures/stacks/dijkstras_two_stack_algorithm.py) * [Infix To Postfix Conversion](data_structures/stacks/infix_to_postfix_conversion.py) * [Infix To Prefix Conversion](data_structures/stacks/infix_to_prefix_conversion.py) + * [Postfix to Prefix Conversion](data_structures/stacks/postfix_to_prefix_conversion.py) * [Next Greater Element](data_structures/stacks/next_greater_element.py) * [Postfix Evaluation](data_structures/stacks/postfix_evaluation.py) * [Prefix Evaluation](data_structures/stacks/prefix_evaluation.py) diff --git a/data_structures/stacks/postfix_to_prefix_conversion.py b/data_structures/stacks/postfix_to_prefix_conversion.py new file mode 100644 index 000000000000..4bd848f290d9 --- /dev/null +++ b/data_structures/stacks/postfix_to_prefix_conversion.py @@ -0,0 +1,49 @@ +""" +Functions: +- postfix_to_prefix(expression): Converts a postfix expression to a prefix expression. +""" + +from .stack import Stack + + +def postfix_to_prefix(expression_str: str) -> str: + """ + Converts a postfix expression to a prefix expression. + + Args: + expression (str): A string representing a postfix expression. + + Returns: + str: A string representing the equivalent prefix expression. + + Raises: + IndexError: If the expression is invalid or contains an invalid operator. + + Example: + >>> postfix_to_prefix('23+5*') + '*+235' + """ + stack: Stack[str] = Stack() + operators = {"+", "-", "*", "/", "^"} + + for char in expression_str: + if char not in operators: + stack.push(char) + else: + operand1 = stack.pop() + operand2 = stack.pop() + stack.push(char + operand2 + operand1) + + return stack.pop() + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + postfix_expression = "ab+c*" + + print("Postfix to infix demo\n") + print("Postfix expression:", postfix_expression) + prefix_expression = postfix_to_prefix(postfix_expression) + print("Prefix expression:", prefix_expression) \ No newline at end of file From edc7fae8959ad192233a12a72f6f0ba364b3745f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 22:53:46 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/stacks/postfix_to_prefix_conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/postfix_to_prefix_conversion.py b/data_structures/stacks/postfix_to_prefix_conversion.py index 4bd848f290d9..16f6f26e6b36 100644 --- a/data_structures/stacks/postfix_to_prefix_conversion.py +++ b/data_structures/stacks/postfix_to_prefix_conversion.py @@ -46,4 +46,4 @@ def postfix_to_prefix(expression_str: str) -> str: print("Postfix to infix demo\n") print("Postfix expression:", postfix_expression) prefix_expression = postfix_to_prefix(postfix_expression) - print("Prefix expression:", prefix_expression) \ No newline at end of file + print("Prefix expression:", prefix_expression)