步骤
1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;2)从左至右扫描中缀表达式;
3)遇到操作数时,将其压s2;
4)遇到运算符时,比较其与s1栈顶运算符的优先级:
1.如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
2.否则,若优先级比栈顶运算符的高,也将运算符压入 s1;
3.否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的 栈顶运算符相比较;5)遇到括号时:
(5)如果是左括号“(”,则直接压入s1
(6)如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃6)重复步骤2至5,直到表达式的最右边
7)将s1中剩余的运算符依次弹出并压入 s2
8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
代码实现
package com.monster.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* @author Monster
* @version v1.0
* @time 03-16-2021 22:10:33
* @description:
*/
public class InfixToSuffix {
public static void main(String[] args) {
String expression = "(12+(9+3*7)+10)";
// 字符串转成List集合 12 + ( ( 3 * 7 - 2 ) + 10 )
List<String> list = toArrayList(expression);
List<String> suffixList = toSuffix(list);
suffixList.forEach(System.out::print);
}
public static List<String> toSuffix(List<String> list) {
List<String> suffixList = new ArrayList<>();
Stack<String> operateStack = new Stack<>();
for (String s : list) {
if (s.matches("\\d+")) {
suffixList.add(s);
} else if ("(".equals(s)) {
operateStack.push(s);
} else if (")".equals(s)) {
while (!"(".equals(operateStack.peek())) {
suffixList.add(operateStack.pop());
}
operateStack.pop();
} else {
while (!operateStack.empty() && getPriority(s) <= getPriority(operateStack.peek())) {
suffixList.add(operateStack.pop());
}
operateStack.push(s);
}
}
while (!operateStack.empty()) {
suffixList.add(operateStack.pop());
}
return suffixList;
}
public static int getPriority(String s) {
if ("+".equals(s) || "-".equals(s)) {
return 0;
} else if ("*".equals(s) || "/".equals(s)) {
return 1;
}else {
return -1;
}
}
public static List<String> toArrayList(String expression) {
String s = "";
List<String> list = new ArrayList<>();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (isOperate(c) || c == '(' || c == ')') {
list.add(Character.toString(c));
}
if (isNumber(c)) {
if (!isNumber(expression.charAt(i + 1))) {
s += c;
list.add(s);
s = "";
} else {
s += c;
}
}
}
return list;
}
public static boolean isOperate(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')';
}
public static boolean isNumber(char c) {
return (c >= '0' && c <= '9');
}
}