Java、将中缀转换为后缀

package collection;

import java.util.*;

public class Exercise20_16 {
    public static void main(String[] args) {
        System.out.print("Enter an infix expression: ");
        String expression = new Scanner(System.in).nextLine();

        System.out.println(infixToPostfix(expression));
    }

    /** 中缀转换为后缀表达式 */
    public static String infixToPostfix(String expression) {
        String[] tokens = formatExpression(expression).split(" ");  //返回表达式空格分隔的数组
        StringBuilder postfix = new StringBuilder(tokens.length * 2);   //字符串构建器(添加后缀表达式)
        Stack<String> stack = new Stack<>();    //操作符栈

        for (String op: tokens) {
            try {   //添加数字进后缀表达式
                String v = String.valueOf(Double.parseDouble(op));
                v = v.endsWith("0") ? String.valueOf(Integer.parseInt(op)) : v;
                postfix.append(v).append(" ");
            } catch (NumberFormatException ex) {
            }

            switch (op) {   //比较操作符
                case "+":
                case "-":
                    while(!stack.isEmpty() && (stack.peek().equals("+") || stack.peek().equals("*") || stack.peek().equals("/"))) {
                        postfix.append(stack.pop()).append(" "); //移除优先级高的操作符
                        stack.push(op);  //添加操作符
                    } stack.push(op); break;
                case "*":
                case "/": stack.push(op); break;
                case "(": stack.push(op); break;
                case ")":
                    while (!stack.isEmpty() && !stack.peek().equals("(")) {
                        postfix.append(stack.pop()).append(" ");    //栈非空且栈顶不为(时,出栈
                    }
                    stack.pop(); break; //移除(
                default:
            }
        }

        //处理剩余操作符
        while (!stack.isEmpty())
            postfix.append(stack.pop()).append(" ");

        return postfix.toString().trim();
    }

    /** 格式化表达式(在数字和操作符间添加一个空格) */
    public static String formatExpression(String expression) {
        StringBuilder builder = new StringBuilder(expression.length());
        expression = expression.replaceAll(" ", "");

        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);

            if (c == '(' || c == ')' || c == '+' || c == '*' || c == '/')
                builder.append(" ").append(c).append(" ");
            else if (Character.isDigit(c) || c == '.')
                builder.append(c);
            else if (c == '-') {
                if (i == 1) builder.append(c);
                else if (expression.charAt(i - 1) == '+' || expression.charAt(i - 1) == '-' ||
                        expression.charAt(i - 1) == '*' || expression.charAt(i - 1) == '/' ||
                        expression.charAt(i - 1) == '(')
                    builder.append(c);
                else
                    builder.append(" ").append(c).append(" ");
            }
        }
        expression = builder.toString().trim().replaceAll(" {2}", " ");
        return expression;
    }
}
package revision;

import java.util.Stack;

/**
 * @create: 2023/10/25
 * @Description:
 * @FileName: Main
 */
public class Main {
    public static void main(String[] args) {
//        String expression = "   ( 1 +2)*   3   ";
        String expression = ". 1*( 1 .0+3)";
        System.out.println(infixToPostfix(expression));
    }

    /** 中缀表达式转换为后缀 */
    public static String infixToPostfix(String expression) {
        if (expression.isEmpty()) return "";    // 空字符串

        String[] split = format(expression).split(" ");     // 格式化后按空格分隔
        StringBuilder postfix = new StringBuilder(split.length << 1);   // 后缀表达式
        Stack<String> operator = new Stack<>();             // 操作符
        for (String sign : split) {
            try {   // 处理数字
                sign = "" + Double.parseDouble(sign);
                if (sign.endsWith("0")) sign = sign.substring(0, sign.indexOf("."));
                postfix.append(sign).append(" ");
                continue;
            } catch (NumberFormatException ignored) {}

            // 处理操作符
            switch (sign) {
                case "+": case "-":
                    while (!operator.isEmpty() && operator.peek().matches("[+*/]")) {
                        postfix.append(operator.pop()).append(" ");
                        operator.push(sign);
                    }
                    operator.push(sign); break;
                case "*": case "/": case "(":
                    operator.push(sign); break;
                case ")":
                    while (!operator.isEmpty() && !operator.peek().equals("(")) {
                        postfix.append(operator.pop()).append(" ");
                    }
                    operator.pop(); break;
                default:
            }
        }
        // 处理剩余操作符
        while (!operator.isEmpty()) postfix.append(operator.pop()).append(" ");

        return postfix.toString().trim();
    }

    /** 格式化表达式 */
    private static String format(String expression) {
        // 在操作符两端加空格
        expression = expression.replaceAll("([+\\-*/()])", " $1 ");
        // 去除多余空格
        expression = expression.replaceAll(" +", " ");
        // 将浮点数连接在一起
        expression = expression.replaceAll(" *\\. *", ".");
        return expression.trim();
    }
}

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来解答您的问题。 中缀表达式是我们平时使用的常规表达式,而后缀表达式也称为逆波兰表达式,是一种没有括号并且运算符号放在操作数之后的表达式。将中缀表达式转换后缀表达式的过程叫做中缀表达式的后缀表达式。 下面介绍一种基于栈的实现方式: 1.初始化一个栈和一个空的后缀表达式 2.从左到右遍历中缀表达式中的每个元素 3.如果遇到操作数,将其添加到后缀表达式中 4.如果遇到左括号,将其推入栈中 5.如果遇到右括号,则弹出栈中元素,将它们添加到后缀表达式中直到遇到左括号。然后将左括号弹出栈。 6.如果遇到运算符,则将其与栈顶运算符比较。如果栈顶运算符优先级高于或等于该运算符,则将栈顶运算符弹出并添加到后缀表达式中,再次至步骤6。如果栈顶运算符优先级低于该运算符或栈为空,则将该运算符压入栈中。 7.在遍历完整个表达式之后,如果栈不为空,则弹出栈中所有元素并添加到后缀表达式中。 下面是一个 Java 实现的例子(带注解): ``` import java.util.Stack; public class InfixToSuffix { public static String infixToSuffix(String expression) { // 接收中缀表达式 StringBuilder suffix = new StringBuilder(); // 存储后缀表达式 Stack<Character> stack = new Stack<>(); // 存储运算符 for (int i = 0; i < expression.length(); i++) { // 从左到右遍历表达式 char c = expression.charAt(i); // 取出表达式中的元素 if (Character.isDigit(c)) { // 如果是数字,直接添加到后缀表达式中 suffix.append(c); } else if (c == '(') { // 如果是左括号,将其压入栈中 stack.push(c); } else if (c == ')') { // 如果是右括号,弹出栈中元素直到遇到左括号 while (!stack.isEmpty() && stack.peek() != '(') { suffix.append(stack.pop()); } stack.pop(); // 弹出左括号 } else { // 如果是运算符 while (!stack.isEmpty() && priority(c) <= priority(stack.peek())) { // 比较优先级 suffix.append(stack.pop()); // 弹出并添加到后缀表达式中 } stack.push(c); // 将运算符压入栈中 } } while (!stack.isEmpty()) { // 遍历完表达式后,弹出栈中所有元素并添加到后缀表达式中 suffix.append(stack.pop()); } return suffix.toString(); } // 返回运算符的优先级 public static int priority(char c) { if (c == '+' || c == '-') { return 1; } else if (c == '*' || c == '/') { return 2; } else { return 0; } } public static void main(String[] args) { String infix = "3+4*2/(1-5)^2"; String suffix = infixToSuffix(infix); System.out.println(suffix); } } ``` 这就是一个中缀表达式转换后缀表达式的 Java 实现。希望这个答案能够帮助到您,如果您还有其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值