Skip to content

Commit ea6457b

Browse files
Hardvanalxkm
andauthored
Add PrefixToInfix.java new algorithm (TheAlgorithms#5552)
* Add `PrefixToInfix.java` new algorithm * Update directory * Fix clang error * Update directory * Fix comment * Add suggested changes --------- Co-authored-by: Hardvan <Hardvan@users.noreply.github.com> Co-authored-by: Alex Klymenko <alexanderklmn@gmail.com>
1 parent b61c547 commit ea6457b

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

DIRECTORY.md

Lines changed: 2 additions & 0 deletions
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)
Lines changed: 69 additions & 0 deletions
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+
}
Lines changed: 44 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy