【数据结构与算法(java)】中缀表达式转换为后缀表达式

中缀表达式转换为后缀表达式

思路:

  1. 初始化两个栈:运算符栈 s1 和储存中间结果的栈 s2;
  2. 从左至右扫描中缀表达式;
  3. 遇到操作数时,将其压入s2;
  4. 遇到运算符时,比较其与 s1 栈顶运算符的优先级:
    (1) 如果 s1 为空,或栈顶运算符为左括号 “(”,则直接将此运算符入栈;
    (2) 否则,若优先级比栈顶运算符的高,也将运算符压入 s1;
    (3) 否则,将 s1 栈顶的运算符弹出并压入到 s2 中,再次转到 (4 - 1) 与 s1 中新的栈顶运算符相比较;
  5. 遇到括号时:
    (1) 如果是左括号 “(”,则直接压入 s1
    (2) 如果是右括号 “)”,则依次弹出 s1 栈顶的运算符,并压入 s2,直到遇到左括号为止,此时将这一对括号丢弃
  6. 重复步骤 2 至 5,直到表达式的最右边
  7. 将 s1 中剩余的运算符依次弹出并压入 s2
  8. 依次弹出 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);
    }
}

posted @ 2025-06-27 09:23  ToFuture$  阅读(33)  评论(0)    收藏  举报