parent
fe61eb2bdf
commit
1ac1a5a6a5
@ -0,0 +1,153 @@
|
||||
package com.thealgorithms.datastructures.stacks;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
/**
|
||||
* Postfix to Infix implementation via Stack
|
||||
*
|
||||
* Function: String getPostfixToInfix(String postfix)
|
||||
* Returns the Infix Expression for the given postfix parameter.
|
||||
*
|
||||
* Avoid using parentheses/brackets/braces for the postfix string.
|
||||
* Postfix Expressions don't require these.
|
||||
*
|
||||
*
|
||||
* @author nikslyon19 (Nikhil Bisht)
|
||||
*
|
||||
*/
|
||||
|
||||
public class PostfixToInfix {
|
||||
|
||||
|
||||
public static boolean isOperator(char token)
|
||||
{
|
||||
switch(token)
|
||||
{
|
||||
case '+':
|
||||
case '-':
|
||||
case '/':
|
||||
case '*':
|
||||
case '^':
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public static boolean isValidPostfixExpression(String postfix)
|
||||
{
|
||||
/* Postfix expression length should NOT be less than 3 */
|
||||
if(postfix.length() < 3) return false;
|
||||
|
||||
|
||||
/* First two characters should NOT be operators */
|
||||
if(isOperator(postfix.charAt(0))) return false;
|
||||
if(isOperator(postfix.charAt(1))) return false;
|
||||
|
||||
|
||||
int operandCount = 0;
|
||||
int operatorCount = 0;
|
||||
|
||||
|
||||
/* Traverse the postfix string to check if --> Number of operands = Number of operators + 1 */
|
||||
for(int i = 0; i < postfix.length(); i++)
|
||||
{
|
||||
char token = postfix.charAt(i);
|
||||
|
||||
if(isOperator(token))
|
||||
{
|
||||
operatorCount++;
|
||||
if(operatorCount >= operandCount) return false;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if(operatorCount == 0)
|
||||
{
|
||||
operandCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(operandCount != operatorCount + 1) return false;
|
||||
|
||||
|
||||
/* Operand count is set to 2 because:-
|
||||
*
|
||||
* 1) the previous set of operands & operators combined have become a single valid expression,
|
||||
* which could be considered/assigned as a single operand.
|
||||
*
|
||||
* 2) the operand in the current iteration.
|
||||
*/
|
||||
operandCount = 2;
|
||||
|
||||
|
||||
/* Reset operator count */
|
||||
operatorCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return (operandCount == operatorCount + 1);
|
||||
}
|
||||
|
||||
|
||||
public static String getPostfixToInfix(String postfix)
|
||||
{
|
||||
String infix = "";
|
||||
|
||||
if(postfix.isEmpty()) return infix;
|
||||
|
||||
|
||||
/* Validate Postfix expression before proceeding with the Infix conversion */
|
||||
if(!isValidPostfixExpression(postfix))
|
||||
{
|
||||
throw new IllegalArgumentException("Invalid Postfix Expression");
|
||||
}
|
||||
|
||||
Stack<String> stack = new Stack<>();
|
||||
StringBuilder valueString = new StringBuilder();
|
||||
|
||||
String operandA, operandB;
|
||||
char operator;
|
||||
|
||||
|
||||
for(int index = 0; index < postfix.length(); index++)
|
||||
{
|
||||
char token = postfix.charAt(index);
|
||||
|
||||
if(!isOperator(token))
|
||||
{
|
||||
stack.push(Character.toString(token));
|
||||
continue;
|
||||
}
|
||||
|
||||
operator = token;
|
||||
operandB = stack.pop();
|
||||
operandA = stack.pop();
|
||||
|
||||
valueString.append('(');
|
||||
|
||||
valueString.append(operandA);
|
||||
valueString.append(operator);
|
||||
valueString.append(operandB);
|
||||
|
||||
valueString.append(')');
|
||||
|
||||
stack.push(valueString.toString());
|
||||
valueString.setLength(0);
|
||||
}
|
||||
|
||||
infix = stack.pop();
|
||||
return infix;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String args[])
|
||||
{
|
||||
assert getPostfixToInfix("ABC+/").equals("(A/(B+C))");
|
||||
assert getPostfixToInfix("AB+CD+*").equals("((A+B)*(C+D))");
|
||||
assert getPostfixToInfix("AB+C+D+").equals("(((A+B)+C)+D)");
|
||||
assert getPostfixToInfix("ABCDE^*/-").equals("(A-(B/(C*(D^E))))");
|
||||
assert getPostfixToInfix("AB+CD^/E*FGH+-^").equals("((((A+B)/(C^D))*E)^(F-(G+H)))");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user