JAVA-算法-中缀表达式转后缀表达式的学习记录
思路
1.遇到数字直接拼成字符串
2.遇到+ - * / 先判断优先级
优先级高于栈顶的则入栈
否则将栈中现有的更高级或同级运算符进行出栈并拼接
3.遇到括号时
如果是左括号 ‘(’ 直接放入栈中作为优先级最低的
如果是右括号 ‘)’,则将栈中的所有元素出栈拼接,直到左括号为止,保证括号内的先运算
4.遍历完成后,将栈中剩余的出栈拼接
原字符串与结果如下:
a+b ab+
a+b-c ab+c-
a+bc abc+
ab+c abc+
a+bc-d abc+d-
(a+b)c ab+c
(a+bc-d)e abc+d-e
a*(b+c) abc+*
代码实现:
public class StackTest3 {
public static void main(String[] args) {
String str1 = "a+b";
String str2 = "a+b-c";
String str3 = "a+b*c";
String str4 = "a*b+c";
String str5 = "a+b*c-d";
System.out.println(infixToSuffix(str1));
System.out.println(infixToSuffix(str2));
System.out.println(infixToSuffix(str3));
System.out.println(infixToSuffix(str4));
System.out.println(infixToSuffix(str5));
String str6 = "(a+b)*c";
String str7 = "(a+b*c-d)*e";
String str8 = "a*(b+c)";
System.out.println(infixToSuffix(str6));
System.out.println(infixToSuffix(str7));
System.out.println(infixToSuffix(str8));
}
private static int priority(char c) {
return switch (c) {
case '*', '/' -> 2;
case '+', '-' -> 1;
case '(' -> 0;
default -> throw new IllegalArgumentException("符号错误: " + c);
};
}
public static String infixToSuffix(String source) {
StringBuilder stringBuilder = new StringBuilder();
// LinkedListStack为定义的符合栈这个数据结构的类
LinkedListStack<Character> stack = new LinkedListStack<>();
for (int i = 0; i < source.length(); i++) {
char cur = source.charAt(i);
switch (cur) {
case '+', '-', '*', '/' -> {
if (stack.isEmpty()) {
stack.push(cur);
} else if (priority(cur) > priority(stack.peek())) {
stack.push(cur);
} else {
while (!stack.isEmpty() && priority(cur) <= priority(stack.peek())) {
stringBuilder.append(stack.pop());
}
stack.push(cur);
}
}
case '(' -> stack.push(cur);
case ')' -> {
while (!stack.isEmpty() && stack.peek() != '(') {
stringBuilder.append(stack.pop());
}
stack.pop();
}
default -> stringBuilder.append(cur);
}
}
while (!stack.isEmpty()) {
stringBuilder.append(stack.pop());
}
return stringBuilder.toString();
}
}