中缀表达式转后缀表达式详解
Posted mx_info
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式转后缀表达式详解相关的知识,希望对你有一定的参考价值。
中缀表达式转后缀表达式详解
思路分析
- 中缀表达式即支持运算的表达式,而方法计算式计算的则是后缀表达式,因此有必要将中缀表达式转换为后缀表达式
- 先将中缀表达式的各项拆分,然后存储到集合中,因为集合方便存和取以及遍历的特点
- 然后遍历集合中各元素,按照指定的规则,将各元素转换为后缀表达式
- 详解见下源码
源码及分析
将中缀表达式存储到集合中
//编写方法将一个中缀表达式存储到集合中
public static List<String> infixExpressionToList(String infixExp) {
//定义ArrayList保存中缀表达式的各元素
ArrayList<String> list = new ArrayList<>();
//定义变量
//定义扫描字符串的指针
int i = 0;
//定义字符串str用来拼接数字
String str = "";
//定义 c 表示当前扫描到的字符
char c;
//循环扫描字符串
do {
//如果当前扫描到的字符是一个非数字,即是一个运算符,则直接添加到List中
if ((c = infixExp.charAt(i)) < 48 || (c = infixExp.charAt(i)) > 57) {
list.add(c + "");
i++;
} else {
//否则扫描到的就是一个数字,需要考虑多位数的情况
//先将str置空
str = "";
//循环判断当前数字的下一位是否任然是数字,如果是,则拼接,否则结束循环
while (i < infixExp.length() && (c = infixExp.charAt(i)) >= 48 && (c = infixExp.charAt(i)) <= 57) {
str += infixExp.charAt(i);
i++;
}
list.add(str);
}
} while (i < infixExp.length());
return list;
}
将中缀表达式转换为后缀表达式
//编写方法将中缀表达式转换为后缀表达式,方便计算机的计算
//已将中缀表达式个元素存储到集合中,则只需要转换为后缀表达式存储到集合即可
/**
*
* @param ls 中缀表达式所在集合
* @return 返回后缀表达式
*/
public static List<String> infixParseSufixList(List<String> ls){
//定义一个栈用来辅助转换,基于栈的先进后出特性
Stack<String> stack = new Stack<>();
//定义集合保存转换后的后缀表达式
List<String> list = new ArrayList<>();
//遍历中缀表达式的所有元素,按照指定规则将其加入到集合中
for (String item : ls) {
//使用正则判断取出来的元素,如果取出来的是数字,则直接加入到集合
if (item.matches("\\\\d+")){
list.add(item);
//如果是左括号,则直接入栈
}else if (item.equals("(")){
stack.push(item);
//如果是右括号,则弹出栈中左括号之前的元素,因为考虑到小括号的优先级比其他运算符高
}else if (item.equals(")")){
while (!stack.peek().equals("(")){
list.add(stack.pop());
}
//最后再弹出左括号
stack.pop();
//否则是其他运算符的话就要比较运算符的优先级
}else {
//将高运算符先加入集合,因为要先进行计算
while (stack.size() != 0 && Operation.getOperation(stack.peek()) >= Operation.getOperation(item)){
list.add(stack.pop());
}
//如果是优先级较低的运算符,则直接入栈
stack.push(item);
}
}
//最后将栈中所有的运算符全部出栈加入到集合中
while (!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
比较运算符优先级
//编写一个类,返回运算符对应的优先级
@SuppressWarnings("all")
class Operation{
private static int ADD = 1;
private static int SUB = 1;
private static int MUL = 2;
private static int DIV = 2;
//编写方法返回运算符的优先级
public static int getOperation(String operation){
int res = 0;
switch (operation){
case "+":
res = ADD;
break;
case "-":
res = SUB;
break;
case "*":
res = MUL;
break;
case "/":
res = DIV;
break;
default:
//System.out.println("运算符有误...");
break;
}
return res;
}
}
以上是关于中缀表达式转后缀表达式详解的主要内容,如果未能解决你的问题,请参考以下文章