完整代码:
import java.util.Scanner;
import java.util.Stack;
import org.junit.Test;
/**
* 中缀表达式 -> 后缀表达式
* @author itis666
*/
public class InfixToSuffix {
/**
* 将中缀表达式转换成后缀表达式
* @param resExp 原始输入的中缀表达式
* @return 返回后缀表达式
*/
public String inExpToSuffixExp(String resExp) {
String[] inExp = dealInExp(resExp).split(",");
Stack<String> stack = new Stack<>();
StringBuilder suffixExp = new StringBuilder();
for (String s : inExp) {
if (!isOperator(s)) {
// 遇到数字,直接输出
suffixExp.append(s + ",");
} else if ("(".equals(s)) {
// 遇到左括号,直接压栈
stack.push(s);
} else if (")".equals(s)) {
// 遇到右括号,将栈顶元素依次弹出,直至遇到左括号
while (!"(".equals(stack.get(stack.size() - 1))) {
suffixExp.append(stack.pop() + ",");
}
// 弹出左括号但不输出
stack.pop();
} else if (isOperator(s)) {
// 遇到运算符,当前运算符优先级小于等于栈顶运算符优先级,将栈顶运算符弹出
// 当前运算符继续和新的栈顶运算符比较...
while (!stack.isEmpty()
&&getPriority(s) <= getPriority(stack.get(stack.size()-1))){
suffixExp.append(stack.pop() + ",");
}
stack.push(s);
}
}
// 最后,将栈内还没有弹出的运算符依次弹出
while (!stack.isEmpty()) {
suffixExp.append(stack.pop() + ",");
}
// 去除最后一个,号
suffixExp.delete(suffixExp.length() - 1, suffixExp.length());
return suffixExp.toString();
}
/**
* 预处理中缀表达式
* @param inExp 原始中缀表达式
* @return 返回处理后的中缀表达式
*/
private String dealInExp(String resExp) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < resExp.length(); i++) {
String tmp = resExp.substring(i, i + 1);
if (!isOperator(tmp)) {
sb.append(tmp);
} else {
if (sb.length() == 0) {
sb.append(tmp + ",");
} else if (sb.charAt(sb.length() - 1) == ',') {
sb.append(tmp + ",");
} else {
sb.append("," + tmp + ",");
}
}
}
return sb.toString();
}
/**
* 判断是不是运算符
* @param str 待判断的字符
* @return 返回判断结果
*/
private boolean isOperator(String str) {
return "+-*/()".contains(str);
}
/**
* 获取运算符的优先级
* @param operator 运算符
* @return 返回运算符的优先级
*/
private int getPriority(String operator) {
return "()+-*/".indexOf(operator)/2;
}
@Test
public void test() {
Scanner sc = new Scanner(System.in);
String resExp = sc.nextLine();
System.out.println("后缀表达式:"+inExpToSuffixExp(resExp));
}
}
测试运行1:
66.623*6.5+(20.61+53*69*(2.6+6.9*5))*3.9-6.6
后缀表达式:66.623,6.5,*,20.61,53,69,*,2.6,6.9,5,*,+,*,+,3.9,*,+,6.6,-
测试运行2:
((6*10-62*9)*6+(56-9*66))*6-5
后缀表达式:6,10,*,62,9,*,-,6,*,56,9,66,*,-,+,6,*,5,-