diff --git a/src/main/java/com/thealgorithms/stacks/InfixToPostfix.java b/src/main/java/com/thealgorithms/stacks/InfixToPostfix.java index e3519978..33611bd7 100644 --- a/src/main/java/com/thealgorithms/stacks/InfixToPostfix.java +++ b/src/main/java/com/thealgorithms/stacks/InfixToPostfix.java @@ -1,19 +1,15 @@ package com.thealgorithms.stacks; import java.util.Stack; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public final class InfixToPostfix { private InfixToPostfix() { } - public static void main(String[] args) throws Exception { - assert "32+".equals(infix2PostFix("3+2")); - assert "123++".equals(infix2PostFix("1+(2+3)")); - assert "34+5*6-".equals(infix2PostFix("(3+4)*5-6")); - } - public static String infix2PostFix(String infixExpression) throws Exception { - if (!BalancedBrackets.isBalanced(infixExpression)) { + if (!BalancedBrackets.isBalanced(filterBrackets(infixExpression))) { throw new Exception("invalid expression"); } StringBuilder output = new StringBuilder(); @@ -55,4 +51,10 @@ public final class InfixToPostfix { return -1; } } + + 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/InfixToPostfixTest.java b/src/test/java/com/thealgorithms/stacks/InfixToPostfixTest.java new file mode 100644 index 00000000..02a08e39 --- /dev/null +++ b/src/test/java/com/thealgorithms/stacks/InfixToPostfixTest.java @@ -0,0 +1,33 @@ +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; + +class InfixToPostfixTest { + + @ParameterizedTest + @MethodSource("provideValidExpressions") + void testValidExpressions(String infix, String expectedPostfix) throws Exception { + assertEquals(expectedPostfix, InfixToPostfix.infix2PostFix(infix)); + } + + private static Stream provideValidExpressions() { + return Stream.of(Arguments.of("3+2", "32+"), Arguments.of("1+(2+3)", "123++"), Arguments.of("(3+4)*5-6", "34+5*6-")); + } + + @ParameterizedTest + @MethodSource("provideInvalidExpressions") + void testInvalidExpressions(String infix, String expectedMessage) { + Exception exception = assertThrows(Exception.class, () -> InfixToPostfix.infix2PostFix(infix)); + assertEquals(expectedMessage, exception.getMessage()); + } + + private static Stream provideInvalidExpressions() { + return Stream.of(Arguments.of("((a+b)*c-d", "invalid expression")); + } +}