From bdc0b3f676f40ab2880bb6beb2a606b86838e1e0 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 10:56:09 +0530 Subject: [PATCH 01/15] Add `Infix To Prefix` new algorithm --- .../thealgorithms/stacks/InfixToPrefix.java | 83 +++++++++++++++++++ .../stacks/InfixToPrefixTest.java | 41 +++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/main/java/com/thealgorithms/stacks/InfixToPrefix.java create mode 100644 src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java diff --git a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java new file mode 100644 index 000000000000..ce1f65b95b99 --- /dev/null +++ b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java @@ -0,0 +1,83 @@ +package com.thealgorithms.stacks; + +import java.util.Stack; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class InfixToPrefix { + private InfixToPrefix() { + } + + /** + * Converts an infix expression to a prefix expression. + * + * @param infixExpression the infix expression to convert + * @return the prefix expression + * @throws Exception if the infix expression has unbalanced brackets + */ + public static String infix2Prefix(String infixExpression) throws Exception { + if (!BalancedBrackets.isBalanced(filterBrackets(infixExpression))) { + throw new Exception("invalid expression"); + } + StringBuilder output = new StringBuilder(); + Stack stack = new Stack<>(); + // Reverse the infix expression for prefix conversion + String reversedInfix = new StringBuilder(infixExpression).reverse().toString(); + for (char element : reversedInfix.toCharArray()) { + if (Character.isLetterOrDigit(element)) { + output.append(element); + } else if (element == ')') { + stack.push(element); + } else if (element == '(') { + while (!stack.isEmpty() && stack.peek() != ')') { + output.append(stack.pop()); + } + stack.pop(); + } else { + while (!stack.isEmpty() && precedence(element) < precedence(stack.peek())) { + output.append(stack.pop()); + } + stack.push(element); + } + } + while (!stack.isEmpty()) { + output.append(stack.pop()); + } + + // Reverse the result to get the prefix expression + return output.reverse().toString(); + } + + /** + * Determines the precedence of an operator. + * + * @param operator the operator whose precedence is to be determined + * @return the precedence of the operator + */ + private static int precedence(char operator) { + switch (operator) { + case '+': + case '-': + return 0; + case '*': + case '/': + return 1; + case '^': + return 2; + default: + return -1; + } + } + + /** + * Filters out all characters from the input string except brackets. + * + * @param input the input string to filter + * @return a string containing only brackets from the input string + */ + private static String filterBrackets(String input) { + Pattern pattern = Pattern.compile("[^(){}\\[\\]<>]"); + Matcher matcher = pattern.matcher(input); + return matcher.replaceAll(""); + } +} diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java new file mode 100644 index 000000000000..077272f69990 --- /dev/null +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -0,0 +1,41 @@ +package com.thealgorithms.stacks; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class InfixToPrefixTest { + + @ParameterizedTest + @MethodSource("provideValidExpressions") + void testValidExpressions(String infix, String expectedPrefix) throws Exception { + assertEquals(expectedPrefix, InfixToPrefix.infix2Prefix(infix)); + } + + private static Stream provideValidExpressions() { + return Stream.of( + Arguments.of("3+2", "+32"), // Simple addition + Arguments.of("1+(2+3)", "+1+23"), // Parentheses + Arguments.of("(3+4)*5-6", "-*+3456"), // Nested operations + Arguments.of("a+b*c", "+a*bc") // Multiplication precedence + ); + } + + @ParameterizedTest + @MethodSource("provideInvalidExpressions") + void testInvalidExpressions(String infix, String expectedMessage) { + Exception exception = assertThrows(Exception.class, () -> InfixToPrefix.infix2Prefix(infix)); + assertEquals(expectedMessage, exception.getMessage()); + } + + private static Stream provideInvalidExpressions() { + return Stream.of( + Arguments.of("((a+b)*c-d", "invalid expression"), // Missing closing bracket + Arguments.of("a++b", "invalid expression") // Invalid operator + ); + } +} From 6a0d2639af16c9e8c7d390fa412ebed880a32541 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Thu, 3 Oct 2024 05:26:27 +0000 Subject: [PATCH 02/15] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index ee09790ed64d..9539ce1b232d 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -540,6 +540,7 @@ * [DecimalToAnyUsingStack](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/DecimalToAnyUsingStack.java) * [DuplicateBrackets](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/DuplicateBrackets.java) * [InfixToPostfix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/InfixToPostfix.java) + * [InfixToPrefix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java) * [LargestRectangle](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/LargestRectangle.java) * [MaximumMinimumWindow](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/MaximumMinimumWindow.java) * [NextGreaterElement](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/NextGreaterElement.java) @@ -963,6 +964,7 @@ * [DecimalToAnyUsingStackTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/DecimalToAnyUsingStackTest.java) * [DuplicateBracketsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/DuplicateBracketsTest.java) * [InfixToPostfixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/InfixToPostfixTest.java) + * [InfixToPrefixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java) * [LargestRectangleTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/LargestRectangleTest.java) * [NextGreaterElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextGreaterElementTest.java) * [NextSmallerElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextSmallerElementTest.java) From a3eeb1ba882d89083756848ea38b22e362669d17 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Thu, 3 Oct 2024 05:27:33 +0000 Subject: [PATCH 03/15] Update directory --- DIRECTORY.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index a1b154ec35be..e547bdc82ac1 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -451,6 +451,8 @@ * [TowerOfHanoi](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/others/TowerOfHanoi.java) * [TwoPointers](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/others/TwoPointers.java) * [Verhoeff](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/others/Verhoeff.java) + * Recursion + * [GenerateSubsets](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/Recursion/GenerateSubsets.java) * scheduling * [FCFSScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/FCFSScheduling.java) * [PreemptivePriorityScheduling](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/scheduling/PreemptivePriorityScheduling.java) @@ -894,6 +896,8 @@ * [TestPrintMatrixInSpiralOrder](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/others/TestPrintMatrixInSpiralOrder.java) * [TwoPointersTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/others/TwoPointersTest.java) * [WorstFitCPUTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/others/WorstFitCPUTest.java) + * Recursion + * [GenerateSubsetsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/Recursion/GenerateSubsetsTest.java) * scheduling * [FCFSSchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/FCFSSchedulingTest.java) * [PreemptivePrioritySchedulingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/scheduling/PreemptivePrioritySchedulingTest.java) From 27c6c0df4d4fd4cd82c30cedabdb5f4dece10e99 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 10:58:13 +0530 Subject: [PATCH 04/15] Fix clang --- .../com/thealgorithms/stacks/InfixToPrefixTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java index 077272f69990..b48076fede05 100644 --- a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -18,10 +18,10 @@ void testValidExpressions(String infix, String expectedPrefix) throws Exception private static Stream provideValidExpressions() { return Stream.of( - Arguments.of("3+2", "+32"), // Simple addition - Arguments.of("1+(2+3)", "+1+23"), // Parentheses - Arguments.of("(3+4)*5-6", "-*+3456"), // Nested operations - Arguments.of("a+b*c", "+a*bc") // Multiplication precedence + Arguments.of("3+2", "+32"), // Simple addition + Arguments.of("1+(2+3)", "+1+23"), // Parentheses + Arguments.of("(3+4)*5-6", "-*+3456"), // Nested operations + Arguments.of("a+b*c", "+a*bc") // Multiplication precedence ); } @@ -34,8 +34,8 @@ void testInvalidExpressions(String infix, String expectedMessage) { private static Stream provideInvalidExpressions() { return Stream.of( - Arguments.of("((a+b)*c-d", "invalid expression"), // Missing closing bracket - Arguments.of("a++b", "invalid expression") // Invalid operator + Arguments.of("((a+b)*c-d", "invalid expression"), // Missing closing bracket + Arguments.of("a++b", "invalid expression") // Invalid operator ); } } From abf24f2e20e318af214838ece83c3f693452c6a6 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 11:00:02 +0530 Subject: [PATCH 05/15] Fix clang --- .../java/com/thealgorithms/stacks/InfixToPrefixTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java index b48076fede05..fbee0dcd12a3 100644 --- a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -17,8 +17,7 @@ void testValidExpressions(String infix, String expectedPrefix) throws Exception } private static Stream provideValidExpressions() { - return Stream.of( - Arguments.of("3+2", "+32"), // Simple addition + return Stream.of(Arguments.of("3+2", "+32"), // Simple addition Arguments.of("1+(2+3)", "+1+23"), // Parentheses Arguments.of("(3+4)*5-6", "-*+3456"), // Nested operations Arguments.of("a+b*c", "+a*bc") // Multiplication precedence @@ -33,8 +32,7 @@ void testInvalidExpressions(String infix, String expectedMessage) { } private static Stream provideInvalidExpressions() { - return Stream.of( - Arguments.of("((a+b)*c-d", "invalid expression"), // Missing closing bracket + return Stream.of(Arguments.of("((a+b)*c-d", "invalid expression"), // Missing closing bracket Arguments.of("a++b", "invalid expression") // Invalid operator ); } From 60c2c247e041211808d3dd35dad84d2ac9dae431 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 11:03:05 +0530 Subject: [PATCH 06/15] Add more tests --- .../stacks/InfixToPrefixTest.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java index fbee0dcd12a3..3309db3c724a 100644 --- a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -20,20 +20,12 @@ private static Stream provideValidExpressions() { return Stream.of(Arguments.of("3+2", "+32"), // Simple addition Arguments.of("1+(2+3)", "+1+23"), // Parentheses Arguments.of("(3+4)*5-6", "-*+3456"), // Nested operations - Arguments.of("a+b*c", "+a*bc") // Multiplication precedence - ); - } - - @ParameterizedTest - @MethodSource("provideInvalidExpressions") - void testInvalidExpressions(String infix, String expectedMessage) { - Exception exception = assertThrows(Exception.class, () -> InfixToPrefix.infix2Prefix(infix)); - assertEquals(expectedMessage, exception.getMessage()); - } - - private static Stream provideInvalidExpressions() { - return Stream.of(Arguments.of("((a+b)*c-d", "invalid expression"), // Missing closing bracket - Arguments.of("a++b", "invalid expression") // Invalid operator + Arguments.of("a+b*c", "+a*bc"), // Multiplication precedence + Arguments.of("a+b*c/d", "+a/b*c*d"), // Division precedence + Arguments.of("a+b*c-d", "-+a*bc"), // Subtraction precedence + Arguments.of("a+b*c/d-e", "-+a/b*cde"), // Mixed precedence + Arguments.of("a+b*(c-d)", "+a-*bcd"), // Parentheses precedence + Arguments.of("a+b*(c-d)/e", "/+a-*bcde"), // Mixed precedence with parentheses ); } } From 004735f415011eaa36af3d645e65dc337d5fe1d5 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 11:05:09 +0530 Subject: [PATCH 07/15] Fix comma error --- src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java index 3309db3c724a..b719cb5daae1 100644 --- a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -25,7 +25,7 @@ private static Stream provideValidExpressions() { Arguments.of("a+b*c-d", "-+a*bc"), // Subtraction precedence Arguments.of("a+b*c/d-e", "-+a/b*cde"), // Mixed precedence Arguments.of("a+b*(c-d)", "+a-*bcd"), // Parentheses precedence - Arguments.of("a+b*(c-d)/e", "/+a-*bcde"), // Mixed precedence with parentheses + Arguments.of("a+b*(c-d)/e", "/+a-*bcde") // Mixed precedence with parentheses ); } } From a2a0b837a75b8b0ac4d180550a7b252596cfd663 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 11:07:40 +0530 Subject: [PATCH 08/15] Fix test cases --- .../com/thealgorithms/stacks/InfixToPrefixTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java index b719cb5daae1..5053ad4199e7 100644 --- a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -21,11 +21,11 @@ private static Stream provideValidExpressions() { Arguments.of("1+(2+3)", "+1+23"), // Parentheses Arguments.of("(3+4)*5-6", "-*+3456"), // Nested operations Arguments.of("a+b*c", "+a*bc"), // Multiplication precedence - Arguments.of("a+b*c/d", "+a/b*c*d"), // Division precedence - Arguments.of("a+b*c-d", "-+a*bc"), // Subtraction precedence - Arguments.of("a+b*c/d-e", "-+a/b*cde"), // Mixed precedence - Arguments.of("a+b*(c-d)", "+a-*bcd"), // Parentheses precedence - Arguments.of("a+b*(c-d)/e", "/+a-*bcde") // Mixed precedence with parentheses + Arguments.of("a+b*c/d", "+a/*bcd"), // Division precedence + Arguments.of("a+b*c-d", "-+a*bcd"), // Subtraction precedence + Arguments.of("a+b*c/d-e", "-+a/*bcde"), // Mixed precedence + Arguments.of("a+b*(c-d)", "+a*b-cd"), // Parentheses precedence + Arguments.of("a+b*(c-d)/e", "+a/*b-cde") // Mixed precedence with parentheses ); } } From a3c67fe6095f3a9ff9d642a80eadeebf2a9f6b1b Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 11:09:59 +0530 Subject: [PATCH 09/15] Fix comment --- src/main/java/com/thealgorithms/stacks/InfixToPrefix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java index ce1f65b95b99..f8b6116897fa 100644 --- a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java +++ b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java @@ -9,7 +9,7 @@ private InfixToPrefix() { } /** - * Converts an infix expression to a prefix expression. + * Convert an infix expression to a prefix expression. * * @param infixExpression the infix expression to convert * @return the prefix expression From 0f701336018cfa1d7c759c9faba48df6c1369ac0 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 11:23:29 +0530 Subject: [PATCH 10/15] Remove unused import --- src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java index 5053ad4199e7..227570eb9a59 100644 --- a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -1,7 +1,6 @@ package com.thealgorithms.stacks; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; From bd35cee8b856c06ebc996791a2210dc559c60691 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Thu, 3 Oct 2024 14:02:23 +0000 Subject: [PATCH 11/15] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 6dcade447fc4..69bac9f9b4d9 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -238,6 +238,7 @@ * [KnapsackMemoization](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/KnapsackMemoization.java) * [LevenshteinDistance](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/LevenshteinDistance.java) * [LongestAlternatingSubsequence](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/LongestAlternatingSubsequence.java) + * [LongestArithmeticSubsequence](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/LongestArithmeticSubsequence.java) * [LongestCommonSubsequence](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/LongestCommonSubsequence.java) * [LongestIncreasingSubsequence](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/LongestIncreasingSubsequence.java) * [LongestPalindromicSubsequence](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/LongestPalindromicSubsequence.java) @@ -734,6 +735,7 @@ * [KnapsackTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackTest.java) * [LevenshteinDistanceTests](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/LevenshteinDistanceTests.java) * [LongestAlternatingSubsequenceTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/LongestAlternatingSubsequenceTest.java) + * [LongestArithmeticSubsequenceTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/LongestArithmeticSubsequenceTest.java) * [LongestIncreasingSubsequenceTests](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/LongestIncreasingSubsequenceTests.java) * [LongestPalindromicSubstringTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/LongestPalindromicSubstringTest.java) * [LongestValidParenthesesTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/LongestValidParenthesesTest.java) From 24c144f4fac1a946a525bd4a9babcc875a2ae5fa Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Thu, 3 Oct 2024 19:36:35 +0530 Subject: [PATCH 12/15] Add tests for null & empty strings --- .../com/thealgorithms/stacks/InfixToPrefix.java | 16 +++++++++++++--- .../thealgorithms/stacks/InfixToPrefixTest.java | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java index f8b6116897fa..ef6278d789da 100644 --- a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java +++ b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java @@ -13,11 +13,21 @@ private InfixToPrefix() { * * @param infixExpression the infix expression to convert * @return the prefix expression - * @throws Exception if the infix expression has unbalanced brackets + * @throws IllegalArgumentException if the infix expression has unbalanced brackets + * @throws NullPointerException if the infix expression is null */ - public static String infix2Prefix(String infixExpression) throws Exception { + public static String infix2Prefix(String infixExpression) throws IllegalArgumentException { + // Check for unbalanced brackets if (!BalancedBrackets.isBalanced(filterBrackets(infixExpression))) { - throw new Exception("invalid expression"); + throw new IllegalArgumentException("invalid expression"); + } + // Null input + if (infixExpression == null) { + throw new NullPointerException("null input"); + } + // Empty string + if (infixExpression.isEmpty()) { + return ""; } StringBuilder output = new StringBuilder(); Stack stack = new Stack<>(); diff --git a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java index 227570eb9a59..91be8a63da62 100644 --- a/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java +++ b/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java @@ -1,8 +1,10 @@ package com.thealgorithms.stacks; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -15,6 +17,18 @@ void testValidExpressions(String infix, String expectedPrefix) throws Exception assertEquals(expectedPrefix, InfixToPrefix.infix2Prefix(infix)); } + @Test + void testEmptyString() { + // Assuming that an empty string returns an empty prefix or throws an exception + assertEquals("", InfixToPrefix.infix2Prefix("")); + } + + @Test + void testNullValue() { + // Assuming that a null input throws a NullPointerException + assertThrows(NullPointerException.class, () -> InfixToPrefix.infix2Prefix(null)); + } + private static Stream provideValidExpressions() { return Stream.of(Arguments.of("3+2", "+32"), // Simple addition Arguments.of("1+(2+3)", "+1+23"), // Parentheses From ed73382663dcbb4cd7d09037d53e5db2f1e48604 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Fri, 4 Oct 2024 19:47:55 +0530 Subject: [PATCH 13/15] Implement suggested changes --- .../com/thealgorithms/stacks/InfixToPrefix.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java index ef6278d789da..29246c9fa0f2 100644 --- a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java +++ b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java @@ -17,18 +17,17 @@ private InfixToPrefix() { * @throws NullPointerException if the infix expression is null */ public static String infix2Prefix(String infixExpression) throws IllegalArgumentException { - // Check for unbalanced brackets - if (!BalancedBrackets.isBalanced(filterBrackets(infixExpression))) { - throw new IllegalArgumentException("invalid expression"); - } - // Null input if (infixExpression == null) { - throw new NullPointerException("null input"); + throw new NullPointerException("Input expression cannot be null."); } - // Empty string + infixExpression = infixExpression.trim(); if (infixExpression.isEmpty()) { return ""; } + if (!BalancedBrackets.isBalanced(filterBrackets(infixExpression))) { + throw new IllegalArgumentException("Invalid expression: unbalanced brackets."); + } + StringBuilder output = new StringBuilder(); Stack stack = new Stack<>(); // Reverse the infix expression for prefix conversion From bcbabb93ff18cb4bdfe867edf0b4443d55950685 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Fri, 4 Oct 2024 16:31:41 +0000 Subject: [PATCH 14/15] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index e6cb89b5cf28..4fb916996aac 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -268,6 +268,7 @@ * greedyalgorithms * [ActivitySelection](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/ActivitySelection.java) * [CoinChange](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/CoinChange.java) + * [DigitSeparation](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/DigitSeparation.java) * [FractionalKnapsack](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/FractionalKnapsack.java) * [GaleShapley](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/GaleShapley.java) * [JobSequencing](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/JobSequencing.java) @@ -760,6 +761,7 @@ * greedyalgorithms * [ActivitySelectionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/ActivitySelectionTest.java) * [CoinChangeTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/CoinChangeTest.java) + * [DigitSeparationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/DigitSeparationTest.java) * [FractionalKnapsackTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/FractionalKnapsackTest.java) * [GaleShapleyTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/GaleShapleyTest.java) * [JobSequencingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/JobSequencingTest.java) From d7031aa4df212a89d10610399e5d4dfb1304edca Mon Sep 17 00:00:00 2001 From: Hardik Pawar <97388607+Hardvan@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:06:57 +0530 Subject: [PATCH 15/15] Fix comment --- src/main/java/com/thealgorithms/stacks/InfixToPrefix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java index 29246c9fa0f2..3d90d14e0d1e 100644 --- a/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java +++ b/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java @@ -9,7 +9,7 @@ private InfixToPrefix() { } /** - * Convert an infix expression to a prefix expression. + * Convert an infix expression to a prefix expression using stack. * * @param infixExpression the infix expression to convert * @return the prefix expression