diff --git a/.github/workflows/checkstyle.yml b/.github/workflows/checkstyle.yml index 052112e29332..7fce2a20fceb 100644 --- a/.github/workflows/checkstyle.yml +++ b/.github/workflows/checkstyle.yml @@ -20,6 +20,7 @@ jobs: - name: Commit Format changes if: failure() run: | + git diff git config --global user.name github-actions git config --global user.email '${GITHUB_ACTOR}@users.noreply.github.com' git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY diff --git a/DIRECTORY.md b/DIRECTORY.md index 2ac0c93b082f..bff318be1848 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -75,6 +75,7 @@ * Stacks * [BalancedBrackets](https://github.com/TheAlgorithms/Java/blob/master/DataStructures/Stacks/BalancedBrackets.java) * [DecimalToAnyUsingStack](https://github.com/TheAlgorithms/Java/blob/master/DataStructures/Stacks/DecimalToAnyUsingStack.java) + * [InfixToPostfix](https://github.com/TheAlgorithms/Java/blob/master/DataStructures/Stacks/InfixToPostfix.java) * [NodeStack](https://github.com/TheAlgorithms/Java/blob/master/DataStructures/Stacks/NodeStack.java) * [StackArray](https://github.com/TheAlgorithms/Java/blob/master/DataStructures/Stacks/StackArray.java) * [StackArrayList](https://github.com/TheAlgorithms/Java/blob/master/DataStructures/Stacks/StackArrayList.java) diff --git a/DataStructures/Stacks/InfixToPostfix.java b/DataStructures/Stacks/InfixToPostfix.java new file mode 100644 index 000000000000..862c0150d136 --- /dev/null +++ b/DataStructures/Stacks/InfixToPostfix.java @@ -0,0 +1,55 @@ +package DataStructures.Stacks; + +import java.util.Stack; + +public class 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)) { + throw new Exception("invalid expression"); + } + StringBuilder output = new StringBuilder(); + Stack stack = new Stack<>(); + for (char element : infixExpression.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()); + } + return output.toString(); + } + + private static int precedence(char operator) { + switch (operator) { + case '+': + case '-': + return 0; + case '*': + case '/': + return 1; + case '^': + return 2; + default: + return -1; + } + } +}