55 lines
1.5 KiB
Java
55 lines
1.5 KiB
Java
|
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<Character> 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;
|
||
|
}
|
||
|
}
|
||
|
}
|