【数据结构与算法(java)】中缀表达式转换为后缀表达式
中缀表达式转换为后缀表达式
思路:
- 初始化两个栈:运算符栈 s1 和储存中间结果的栈 s2;
- 从左至右扫描中缀表达式;
- 遇到操作数时,将其压入s2;
- 遇到运算符时,比较其与 s1 栈顶运算符的优先级:
(1) 如果 s1 为空,或栈顶运算符为左括号 “(”,则直接将此运算符入栈;
(2) 否则,若优先级比栈顶运算符的高,也将运算符压入 s1;
(3) 否则,将 s1 栈顶的运算符弹出并压入到 s2 中,再次转到 (4 - 1) 与 s1 中新的栈顶运算符相比较; - 遇到括号时:
(1) 如果是左括号 “(”,则直接压入 s1
(2) 如果是右括号 “)”,则依次弹出 s1 栈顶的运算符,并压入 s2,直到遇到左括号为止,此时将这一对括号丢弃 - 重复步骤 2 至 5,直到表达式的最右边
- 将 s1 中剩余的运算符依次弹出并压入 s2
- 依次弹出 s2 中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
import java.util.Scanner;
import java.util.Stack;
public class InfixToPostfix {
private static boolean isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')';
}
private static int precedence(char op) {
if (op == '+' || op == '-') {
return 1;
}
if (op == '*' || op == '/') {
return 2;
}
return 0;
}
public static String infixToPosfix(String infix) {
StringBuilder postfix = new StringBuilder();
Stack<Character> stack = new Stack<>();
String[] tokens = infix.split("\\s+");
for (String token : tokens) {
if (token.length() == 1 && isOperator(token.charAt(0))) {
switch (token.charAt(0)) {
case '(':
stack.push(token.charAt(0));
break;
case ')':
while (!stack.isEmpty() && stack.peek() != '(') {
postfix.append(stack.pop()).append(' ');
}
stack.pop();
break;
default:
while (!stack.isEmpty() && precedence(stack.peek()) >= precedence(token.charAt(0))) {
postfix.append(stack.pop()).append(' ');
}
stack.push(token.charAt(0));
break;
}
} else {
postfix.append(token).append(' ');
}
}
while (!stack.isEmpty()) {
postfix.append(stack.pop()).append(' ');
}
return postfix.toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String infix = scanner.nextLine();
scanner.close();
String postfix = infixToPosfix(infix);
System.out.println(postfix);
}
}
浙公网安备 33010602011771号