中缀、后缀表达式(整数)的介绍、转换及运算
一.简介
前缀:波兰表达式(运算符在操作数之前) 如 (+ - * 3 4 5 6)
中缀:我们常见的表达式 如(3+4)* 5 – 6,便于人的理解,不利于计算机计算。
后缀:又称逆波兰表达式,如(3 4 + 5 * 6 -),便于计算机计算,但是不利于人的理解。
二.中缀表达式转后缀表达式
具体转换方式:
方式一:
1.从左到右进行遍历
2.运算数:直接输出.
3.左括号:直接压入栈(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈)
4.右括号,(意味着括号已结束)不断弹出栈顶运算符并输出,直到遇到左括号(括号弹出但不输出)
5.运算符,将该运算符与栈顶运算符进行比较,
如果优先级高于栈顶运算符,则压入栈(暂时不进行运算)。
如果优先级小于等于栈顶的运算符,则将栈顶运算符弹出并输出,然后比较新的栈顶运算符。
6.如果对象处理完毕,则按顺序弹出并输出栈中所有运算符。
举例如下
步骤 | 数据 | 栈(栈底–>栈底) | 输出 |
---|---|---|---|
1 | (3+5)*5-6 | ||
2 | 3+5)*5-6 | ( | |
3 | +5)*5-6 | ( | 3 |
4 | 5)*5-6 | ( + | 3 |
5 | )*5-6 | ( + | 3 5 |
6 | *5-6 | 3 5 + | |
7 | 5-6 | * | 3 5 + |
8 | -6 | * | 3 5 + 5 |
9 | 6 | - | 3 5 + 5 * |
10 | - | 3 5 + 5 * 6 | |
11 | 3 5 + 5 * 6 - |
方式二: 按照运算的顺序,每一次运算加一个括号,然后将运算符放到括号后边
注:步骤二输出结果有括号是为了表示3 5 +是一个整体,方便与后面的进行运算
步骤 | 数据 | 输出 |
---|---|---|
1 | (3+5)* 5 – 6 | |
2 | ((3+5))* 5 – 6 | (3 5 +)* 5 – 6 |
3 | ((3 5 +)* 5) – 6 | 3 5 + 5 * – 6 |
4 | (3 5 + 5 * )– 6 | 3 5 + 5 * 6 - |
三.中缀表达式转后缀表达式代码实现
以下有三个方法
1.change():该方法入参是一个中缀表达式-------作用是将中缀表达式转化成后缀表达式的集合
原式:(3+4)*5-6
中缀list输出结果[(, 3, +, 4, ), *, 5, -, 6]
2.compare():该方法是对运算符进行一个优先级的比较,返回1和2-----通过int类型比较比字符串比较方便。
3.out():该方法是将中缀表达式集合转化成后缀表达式集合。
中缀list输出结果[(, 3, +, 4, ), *, 5, -, 6]
后缀list输出结果[3, 4, +, 5, *, 6, -]
//将中缀表达式(字符串)转化成list (3+4)*5-6
public static List<String> change(String expression){
List<String> list = new ArrayList<>();
int index = 0 ;//下标
char c ;//存放每一次遍历的字符
String str;
do {
if ((c=expression.charAt(index)) < 48 || (c=expression.charAt(index)) > 57 ){
//不是数字
list.add(c+"");
index ++;
}else{
//是数字
str = "";//置空
while (index < expression.length() && (c=expression.charAt(index)) >= 48 &&(c=expression.charAt(index)) <= 57 ){
//继续往后遍历,直到遇到不是数字的
str += c;
index ++;
}
list.add(str);
}
}while(index < expression.length());
return list;
}
//中缀转后缀
public static List<String> out(List<String> list){
Stack<String> s = new Stack<>();//存放符号
List<String> l = new ArrayList<>();//存放输出的值
//循环遍历list
for (String s1: list) {
if (s1.matches("\\d+")){
//正则匹配数字
l.add(s1);
}else if (s1.equals("(")){
//如果是"("
s.push(s1);
}else if (s1.equals(")")){
//如果是")"
//弹出栈中的符号,放入输出的集合中,直到遇到"("