1.首先将中缀字符串放入集合列如: (3+20)*(3-10) - -> [(, 3, +, 20, ), *, 3, -, 10]
1.数字的ascll码为 48-57 如果是运算符或括号直接加入集合
2.在不越界和是数字的情况下, 一直循环拼接多位数 为字符串 str
public List<String> InfixStrToInfixList(String expression) {
List<String> arrayList = new ArrayList<>();
int index = 0; //索引
String str; //拼接多位数
do {
//如果是非数字,加入集合
if (expression.charAt(index) < 48 || expression.charAt(index) > 57) {
arrayList.add(expression.charAt(index) + "");
index++;
} else { //是一个数, 需要考虑多位数
str = ""; //拼接前 先将str置空
//没有越界,并且是数字就一直拼接
while (index < expression.length() && expression.charAt(index) >= 48 && expression.charAt(index) <= 57) {
str += expression.charAt(index);
index++;
}
arrayList.add(str); //str 拼接完成
}
} while (index < expression.length());
return arrayList; }
2.中缀表达式集合转换为 后缀表达式集合 [(, 3, +, 20, ), *, 3, -, 10] -> [3, 20, +, 3, 10, -, *]
1.定义栈 operatorStack 存放符号 2.定义集合 numbersList 存放数据及最终 转换完成的 表达式
3.遍历 中缀表达式 如果item是数字直接加入数据集合 如果是 "(" 直接加入符号栈
4.如果item是 " ) " 就循环弹出 符号栈栈顶 加入数据集合 ,直到遇到 "(" ,
循环完成 弹出符号栈的 "(" ,相当于将( ) 中间的符号和数字加入数据集合 并消除 ( )
5.如果是item 是运算符,分两种情况:
1. item 优先级 小于等于 符号栈 栈顶的优先级, 就将 符号栈弹出加入数据集合 ,一直循环直到item 优先级大于栈顶,
再将item入符号栈
2. item 优先级 大于 符号栈 栈顶的优先级,直接入符号栈
6.最后将剩余在符号栈的符号依次弹出 加入到数据集合, 集合顺序输出就为后缀表达式
public List<String> infixListToSuffixList(List<String> InfixList) {
Stack<String> operatorStack = new Stack<>(); 存放符号栈
List<String> numbersList = new ArrayList<>(); 存放数据集合
for (String item : InfixList) {
if (item.matches("\\d+")) { //是数字,直接入数据集合
numbersList.add(item);
} else if (item.equals("(")) { //是左括号,直接入符号栈
operatorStack.push(item);
} else if (item.equals(")")) { //是右括号,弹出符号栈到数据集合,直到遇到左括号
while (!operatorStack.peek().equals("(")) { //直到遇到左括号
numbersList.add(operatorStack.pop()); //弹出符号栈到数据集合
}
operatorStack.pop(); //弹出 "(" ,就是消除括号
} else { //是运算符
* 当 item 优先级小于等于 operatorStack栈顶优先级,
* 将符号栈弹出一个加入数据集合,再将item与operatorStack下一个运算符比较,直到item大于它
while (operatorStack.size() != 0
&& OperatorGrade(item) <= OperatorGrade(operatorStack.peek())) {
numbersList.add(operatorStack.pop());
}
operatorStack.push(item); //最后还要将 item 加入符号栈
}
}
while (operatorStack.size()!=0){ //将剩余在 符号栈中的 符号加入数据集合
numbersList.add(operatorStack.pop());
}
return numbersList; //最终集合就为 后缀表达式 }