Skip to content

Commit ea6457b

Browse files
Hardvanalxkm
andauthored
Add PrefixToInfix.java new algorithm (#5552)
* Add `PrefixToInfix.java` new algorithm * Update directory * Fix clang error * Update directory * Fix comment * Add suggested changes --------- Co-authored-by: Hardvan <[email protected]> Co-authored-by: Alex Klymenko <[email protected]>
1 parent b61c547 commit ea6457b

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@
552552
* [NextGreaterElement](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/NextGreaterElement.java)
553553
* [NextSmallerElement](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/NextSmallerElement.java)
554554
* [PostfixToInfix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/PostfixToInfix.java)
555+
* [PrefixToInfix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/PrefixToInfix.java)
555556
* [StackPostfixNotation](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/StackPostfixNotation.java)
556557
* strings
557558
* [AhoCorasick](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/AhoCorasick.java)
@@ -984,6 +985,7 @@
984985
* [NextGreaterElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextGreaterElementTest.java)
985986
* [NextSmallerElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextSmallerElementTest.java)
986987
* [PostfixToInfixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/PostfixToInfixTest.java)
988+
* [PrefixToInfixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/PrefixToInfixTest.java)
987989
* [StackPostfixNotationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/StackPostfixNotationTest.java)
988990
* strings
989991
* [AhoCorasickTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/AhoCorasickTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.thealgorithms.stacks;
2+
3+
import java.util.Stack;
4+
5+
/**
6+
* Converts a prefix expression to an infix expression using a stack.
7+
*
8+
* The input prefix expression should consist of
9+
* valid operands (letters or digits) and operators (+, -, *, /, ^).
10+
* Parentheses are not required in the prefix string.
11+
*/
12+
public final class PrefixToInfix {
13+
private PrefixToInfix() {
14+
}
15+
16+
/**
17+
* Determines if a given character is a valid arithmetic operator.
18+
*
19+
* @param token the character to check
20+
* @return true if the character is an operator, false otherwise
21+
*/
22+
public static boolean isOperator(char token) {
23+
return token == '+' || token == '-' || token == '/' || token == '*' || token == '^';
24+
}
25+
26+
/**
27+
* Converts a valid prefix expression to an infix expression.
28+
*
29+
* @param prefix the prefix expression to convert
30+
* @return the equivalent infix expression
31+
* @throws NullPointerException if the prefix expression is null
32+
*/
33+
public static String getPrefixToInfix(String prefix) {
34+
if (prefix == null) {
35+
throw new NullPointerException("Null prefix expression");
36+
}
37+
if (prefix.isEmpty()) {
38+
return "";
39+
}
40+
41+
Stack<String> stack = new Stack<>();
42+
43+
// Iterate over the prefix expression from right to left
44+
for (int i = prefix.length() - 1; i >= 0; i--) {
45+
char token = prefix.charAt(i);
46+
47+
if (isOperator(token)) {
48+
// Pop two operands from stack
49+
String operandA = stack.pop();
50+
String operandB = stack.pop();
51+
52+
// Form the infix expression with parentheses
53+
String infix = "(" + operandA + token + operandB + ")";
54+
55+
// Push the resulting infix expression back onto the stack
56+
stack.push(infix);
57+
} else {
58+
// Push operand onto stack
59+
stack.push(Character.toString(token));
60+
}
61+
}
62+
63+
if (stack.size() != 1) {
64+
throw new ArithmeticException("Malformed prefix expression");
65+
}
66+
67+
return stack.pop(); // final element on the stack is the full infix expression
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.thealgorithms.stacks;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
6+
import java.util.stream.Stream;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.Arguments;
10+
import org.junit.jupiter.params.provider.MethodSource;
11+
12+
class PrefixToInfixTest {
13+
14+
@ParameterizedTest
15+
@MethodSource("provideValidPrefixToInfixTestCases")
16+
void testValidPrefixToInfixConversion(String prefix, String expectedInfix) {
17+
assertEquals(expectedInfix, PrefixToInfix.getPrefixToInfix(prefix));
18+
}
19+
20+
static Stream<Arguments> provideValidPrefixToInfixTestCases() {
21+
return Stream.of(Arguments.of("A", "A"), // Single operand
22+
Arguments.of("+AB", "(A+B)"), // Addition
23+
Arguments.of("*+ABC", "((A+B)*C)"), // Addition and multiplication
24+
Arguments.of("-+A*BCD", "((A+(B*C))-D)"), // Mixed operators
25+
Arguments.of("/-A*BC+DE", "((A-(B*C))/(D+E))"), // Mixed operators
26+
Arguments.of("^+AB*CD", "((A+B)^(C*D))") // Mixed operators
27+
);
28+
}
29+
30+
@Test
31+
void testEmptyPrefixExpression() {
32+
assertEquals("", PrefixToInfix.getPrefixToInfix(""));
33+
}
34+
35+
@Test
36+
void testNullPrefixExpression() {
37+
assertThrows(NullPointerException.class, () -> PrefixToInfix.getPrefixToInfix(null));
38+
}
39+
40+
@Test
41+
void testMalformedPrefixExpression() {
42+
assertThrows(ArithmeticException.class, () -> PrefixToInfix.getPrefixToInfix("+ABC"));
43+
}
44+
}

0 commit comments

Comments
 (0)