From fdca44194f78b7d0ec9567728273b901ec56223d Mon Sep 17 00:00:00 2001 From: hollowcrust <72879387+hollowcrust@users.noreply.github.com> Date: Sun, 8 Oct 2023 10:05:52 +0800 Subject: [PATCH 1/4] Add doctests, exceptions, type hints and fix bug for infix_to_prefix_conversion.py Add doctests Add exceptions for expressions with invalid bracket positions Add type hints for functions Fix a bug on line 53 (57 in PR) --- .../stacks/infix_to_prefix_conversion.py | 64 +++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/data_structures/stacks/infix_to_prefix_conversion.py b/data_structures/stacks/infix_to_prefix_conversion.py index 6f6d5d57e2cb..ea4055a1434b 100644 --- a/data_structures/stacks/infix_to_prefix_conversion.py +++ b/data_structures/stacks/infix_to_prefix_conversion.py @@ -15,7 +15,7 @@ """ -def infix_2_postfix(infix): +def infix_2_postfix(infix: str) -> str: stack = [] post_fix = [] priority = { @@ -26,6 +26,7 @@ def infix_2_postfix(infix): "+": 1, "-": 1, } # Priority of each operator + print_width = len(infix) if (len(infix) > 7) else 7 # Print table header for output @@ -43,6 +44,9 @@ def infix_2_postfix(infix): elif x == "(": stack.append(x) # if x is "(" push to Stack elif x == ")": # if x is ")" pop stack until "(" is encountered + if len(stack) == 0: # close bracket without open bracket + raise ValueError("Invalid bracket position(s)") + while stack[-1] != "(": post_fix.append(stack.pop()) # Pop stack & add the content to Postfix stack.pop() @@ -50,7 +54,8 @@ def infix_2_postfix(infix): if len(stack) == 0: stack.append(x) # If stack is empty, push x to stack else: # while priority of x is not > priority of element in the stack - while len(stack) > 0 and priority[x] <= priority[stack[-1]]: + while len(stack) > 0 and stack[-1] != '(' \ + and priority[x] <= priority[stack[-1]]: post_fix.append(stack.pop()) # pop stack & add to Postfix stack.append(x) # push x to stack @@ -62,6 +67,9 @@ def infix_2_postfix(infix): ) # Output in tabular format while len(stack) > 0: # while stack is not empty + if stack[-1] == '(': # open bracket with no close bracket + raise ValueError("Invalid bracket position(s)") + post_fix.append(stack.pop()) # pop stack & add to Postfix print( " ".center(8), @@ -73,9 +81,54 @@ def infix_2_postfix(infix): return "".join(post_fix) # return Postfix as str -def infix_2_prefix(infix): - infix = list(infix[::-1]) # reverse the infix equation +def infix_2_prefix(infix: str) -> str: + """ + >>> infix_2_prefix('a+b^c') + Symbol | Stack | Postfix + ---------------------------- + c | | c + ^ | ^ | c + b | ^ | cb + + | + | cb^ + a | + | cb^a + | | cb^a+ + '+a^bc' + + >>> infix_2_prefix('1*((-a)*2+b)') + Symbol | Stack | Postfix + ------------------------------------------- + ( | ( | + b | ( | b + + | (+ | b + 2 | (+ | b2 + * | (+* | b2 + ( | (+*( | b2 + a | (+*( | b2a + - | (+*(- | b2a + ) | (+* | b2a- + ) | | b2a-*+ + * | * | b2a-*+ + 1 | * | b2a-*+1 + | | b2a-*+1* + '*1+*-a2b' + + >>> infix_2_prefix('') + Symbol | Stack | Postfix + ---------------------------- + '' + + >>> infix_2_prefix('(()') + Traceback (most recent call last): + ... + ValueError: Invalid bracket position(s) + >>> infix_2_prefix('())') + Traceback (most recent call last): + ... + ValueError: Invalid bracket position(s) + """ + infix = list(infix[::-1]) # reverse the infix equation + for i in range(len(infix)): if infix[i] == "(": infix[i] = ")" # change "(" to ")" @@ -88,6 +141,9 @@ def infix_2_prefix(infix): if __name__ == "__main__": + from doctest import testmod + testmod() + Infix = input("\nEnter an Infix Equation = ") # Input an Infix equation Infix = "".join(Infix.split()) # Remove spaces from the input print("\n\t", Infix, "(Infix) -> ", infix_2_prefix(Infix), "(Prefix)") From 72d19e8dbdfb3dd789d4c3a9e7b0089564a311f7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 02:14:30 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../stacks/infix_to_prefix_conversion.py | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/data_structures/stacks/infix_to_prefix_conversion.py b/data_structures/stacks/infix_to_prefix_conversion.py index ea4055a1434b..badf5399768a 100644 --- a/data_structures/stacks/infix_to_prefix_conversion.py +++ b/data_structures/stacks/infix_to_prefix_conversion.py @@ -26,7 +26,7 @@ def infix_2_postfix(infix: str) -> str: "+": 1, "-": 1, } # Priority of each operator - + print_width = len(infix) if (len(infix) > 7) else 7 # Print table header for output @@ -44,9 +44,9 @@ def infix_2_postfix(infix: str) -> str: elif x == "(": stack.append(x) # if x is "(" push to Stack elif x == ")": # if x is ")" pop stack until "(" is encountered - if len(stack) == 0: # close bracket without open bracket + if len(stack) == 0: # close bracket without open bracket raise ValueError("Invalid bracket position(s)") - + while stack[-1] != "(": post_fix.append(stack.pop()) # Pop stack & add the content to Postfix stack.pop() @@ -54,8 +54,11 @@ def infix_2_postfix(infix: str) -> str: if len(stack) == 0: stack.append(x) # If stack is empty, push x to stack else: # while priority of x is not > priority of element in the stack - while len(stack) > 0 and stack[-1] != '(' \ - and priority[x] <= priority[stack[-1]]: + while ( + len(stack) > 0 + and stack[-1] != "(" + and priority[x] <= priority[stack[-1]] + ): post_fix.append(stack.pop()) # pop stack & add to Postfix stack.append(x) # push x to stack @@ -67,9 +70,9 @@ def infix_2_postfix(infix: str) -> str: ) # Output in tabular format while len(stack) > 0: # while stack is not empty - if stack[-1] == '(': # open bracket with no close bracket + if stack[-1] == "(": # open bracket with no close bracket raise ValueError("Invalid bracket position(s)") - + post_fix.append(stack.pop()) # pop stack & add to Postfix print( " ".center(8), @@ -86,32 +89,32 @@ def infix_2_prefix(infix: str) -> str: >>> infix_2_prefix('a+b^c') Symbol | Stack | Postfix ---------------------------- - c | | c - ^ | ^ | c - b | ^ | cb - + | + | cb^ - a | + | cb^a - | | cb^a+ + c | | c + ^ | ^ | c + b | ^ | cb + + | + | cb^ + a | + | cb^a + | | cb^a+ '+a^bc' - + >>> infix_2_prefix('1*((-a)*2+b)') - Symbol | Stack | Postfix + Symbol | Stack | Postfix ------------------------------------------- - ( | ( | - b | ( | b - + | (+ | b - 2 | (+ | b2 - * | (+* | b2 - ( | (+*( | b2 - a | (+*( | b2a - - | (+*(- | b2a - ) | (+* | b2a- - ) | | b2a-*+ - * | * | b2a-*+ - 1 | * | b2a-*+1 - | | b2a-*+1* + ( | ( | + b | ( | b + + | (+ | b + 2 | (+ | b2 + * | (+* | b2 + ( | (+*( | b2 + a | (+*( | b2a + - | (+*(- | b2a + ) | (+* | b2a- + ) | | b2a-*+ + * | * | b2a-*+ + 1 | * | b2a-*+1 + | | b2a-*+1* '*1+*-a2b' - + >>> infix_2_prefix('') Symbol | Stack | Postfix ---------------------------- @@ -128,7 +131,7 @@ def infix_2_prefix(infix: str) -> str: ValueError: Invalid bracket position(s) """ infix = list(infix[::-1]) # reverse the infix equation - + for i in range(len(infix)): if infix[i] == "(": infix[i] = ")" # change "(" to ")" @@ -142,8 +145,9 @@ def infix_2_prefix(infix: str) -> str: if __name__ == "__main__": from doctest import testmod + testmod() - + Infix = input("\nEnter an Infix Equation = ") # Input an Infix equation Infix = "".join(Infix.split()) # Remove spaces from the input print("\n\t", Infix, "(Infix) -> ", infix_2_prefix(Infix), "(Prefix)") From 78e8593393b76a6220b9a5b9188ff7771620afa5 Mon Sep 17 00:00:00 2001 From: hollowcrust <72879387+hollowcrust@users.noreply.github.com> Date: Sun, 8 Oct 2023 10:19:53 +0800 Subject: [PATCH 3/4] Change type hints in infix_to_prefix_conversion.py --- data_structures/stacks/infix_to_prefix_conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/infix_to_prefix_conversion.py b/data_structures/stacks/infix_to_prefix_conversion.py index badf5399768a..a207fe45e952 100644 --- a/data_structures/stacks/infix_to_prefix_conversion.py +++ b/data_structures/stacks/infix_to_prefix_conversion.py @@ -15,7 +15,7 @@ """ -def infix_2_postfix(infix: str) -> str: +def infix_2_postfix(infix: list[str]) -> str: stack = [] post_fix = [] priority = { From 6b78ef545b39bef13ba14ca1537e19f748cc8c41 Mon Sep 17 00:00:00 2001 From: hollowcrust <72879387+hollowcrust@users.noreply.github.com> Date: Sun, 8 Oct 2023 10:23:21 +0800 Subject: [PATCH 4/4] Remove printing trailing whitespace in the output table --- data_structures/stacks/infix_to_prefix_conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/infix_to_prefix_conversion.py b/data_structures/stacks/infix_to_prefix_conversion.py index a207fe45e952..a18f4d821837 100644 --- a/data_structures/stacks/infix_to_prefix_conversion.py +++ b/data_structures/stacks/infix_to_prefix_conversion.py @@ -27,7 +27,7 @@ def infix_2_postfix(infix: list[str]) -> str: "-": 1, } # Priority of each operator - print_width = len(infix) if (len(infix) > 7) else 7 + print_width = len(infix) # Print table header for output print(