中缀表达式转前缀java
时间: 2023-09-05 15:15:09 浏览: 218
以下是中缀表达式转前缀的Java代码实现:
```java
import java.util.*;
public class InfixToPrefix {
// 定义运算符的优先级
private static final Map<Character, Integer> precedence = new HashMap<Character, Integer>() {{
put('+', 1);
put('-', 1);
put('*', 2);
put('/', 2);
put('%', 2);
put('^', 3);
}};
// 判断一个字符是否为运算符
private static boolean isOperator(char c) {
return precedence.containsKey(c);
}
// 判断一个字符是否为左括号
private static boolean isLeftParenthesis(char c) {
return c == '(';
}
// 判断一个字符是否为右括号
private static boolean isRightParenthesis(char c) {
return c == ')';
}
// 将中缀表达式转为前缀表达式
public static String infixToPrefix(String infix) {
// 倒序存放中缀表达式
StringBuilder reverseInfix = new StringBuilder(infix).reverse();
Stack<Character> operatorStack = new Stack<>();
StringBuilder prefix = new StringBuilder();
for (int i = 0; i < reverseInfix.length(); i++) {
char c = reverseInfix.charAt(i);
// 如果是右括号,直接入栈
if (isRightParenthesis(c)) {
operatorStack.push(c);
}
// 如果是左括号,将栈中的运算符弹出并添加到前缀表达式中
else if (isLeftParenthesis(c)) {
while (!operatorStack.empty() && !isRightParenthesis(operatorStack.peek())) {
prefix.append(operatorStack.pop());
}
operatorStack.pop();
}
// 如果是运算符,将栈中优先级大于等于该运算符的运算符弹出并添加到前缀表达式中,然后将该运算符入栈
else if (isOperator(c)) {
while (!operatorStack.empty() && precedence.get(operatorStack.peek()) >= precedence.get(c)) {
prefix.append(operatorStack.pop());
}
operatorStack.push(c);
}
// 如果是数字或字母,直接添加到前缀表达式中
else {
prefix.append(c);
}
}
// 将栈中剩余的运算符弹出并添加到前缀表达式中
while (!operatorStack.empty()) {
prefix.append(operatorStack.pop());
}
// 返回前缀表达式的倒序
return prefix.reverse().toString();
}
}
```
使用方法:
```java
String infix = "1+2*3-(4+5)/6";
String prefix = InfixToPrefix.infixToPrefix(infix);
System.out.println(prefix); // -+*23/+-4561
```
阅读全文