中缀表达式转后缀表达式

一、前置知识

在学习中缀表达式转后缀表达式之前,需要先掌握以下几个概念。

1、中缀表达式:指运算符在中间位置的表达式,例如1+2。

2、前缀表达式:指运算符在前面位置的表达式,例如+12。

3、后缀表达式:指运算符在后面位置的表达式,例如12+。

4、运算符优先级:指不同运算符之间的优先级大小,例如乘法的优先级高于加法。

二、中缀表达式转后缀表达式的基本流程

1、从左到右扫描中缀表达式中的每一个数字或者运算符。

2、如果是数字,直接输出到后缀表达式中。

3、如果是左括号,进栈。

4、如果是右括号,将左括号上面的运算符全部弹出栈并输出到后缀表达式中,左右括号不输出。

5、如果是运算符,如果它的优先级比栈顶的运算符高,将它压入栈中。否则,将栈顶的运算符弹出,并输出到后缀表达式中,直到该运算符的优先级大于栈顶运算符的优先级为止。

6、重复步骤1~5,直到中缀表达式扫描完毕。

7、将栈内剩余的运算符依次弹出并输出到后缀表达式中。

三、代码实现

import java.util.Stack;
public class InfixToPostfix {
    public static void main(String[] args) {
        String infixExp = "(1+2)*3-4/5";
        String postfixExp = infixToPostfix(infixExp);
        System.out.println(postfixExp);
    }
    public static String infixToPostfix(String infixExp) {
        Stack operatorStack = new Stack();
        StringBuilder postfixExp = new StringBuilder();
        for (char ch : infixExp.toCharArray()) {
            if (ch >= '0' && ch <= '9') { // 判断数字
                postfixExp.append(ch);
            } else if (ch == '(') { // 左括号直接进栈
                operatorStack.push(ch);
            } else if (ch == ')') { // 右括号弹出栈内全部运算符
                while (operatorStack.peek() != '(') {
                    postfixExp.append(operatorStack.pop());
                }
                operatorStack.pop(); // 弹出左括号
            } else { // 运算符
                while (!operatorStack.isEmpty() && operatorStack.peek() != '(' && priority(ch) <= priority(operatorStack.peek())) {
                    postfixExp.append(operatorStack.pop());
                }
                operatorStack.push(ch);
            }
        }
        while (!operatorStack.isEmpty()) { // 栈内剩余的运算符全部输出
            postfixExp.append(operatorStack.pop());
        }
        return postfixExp.toString();
    }
    private static int priority(char ch) { // 运算符优先级,数字越大,优先级越高
        if (ch == '+' || ch == '-') {
            return 1;
        } else if (ch == '*' || ch == '/') {
            return 2;
        } else {
            return 0; // 括号优先级最高
        }
    }
}

四、实例演示

例如,将中缀表达式“(1+2)*3-4/5”转换为后缀表达式如下:

1 2 + 3 * 4 5 / –

代码运行结果如下:

1+2 -> 12+
(1+2)*3 -> 12+3*
4/5 -> 45/
(1+2)*3-4/5 -> 12+3*45/- -> 12+3*4/5-

五、总结

中缀表达式转后缀表达式使用了栈的思想,通过将运算符依次压入和弹出栈来实现转换功能。在代码实现时,需要注意运算符优先级的大小以及左右括号的处理方式。

掌握了中缀表达式转后缀表达式的知识后,可以在实际编程中更加轻松地操作表达式的计算。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/227276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-09 16:28
下一篇 2024-12-09 16:28

相关推荐

  • vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常问题的解决

    本文旨在解决vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常的问题,提供完整的代码示例供参考。 一、分析问题 首先,需了解vue中下载文件的情况。一般情况下,我们…

    编程 2025-04-29
  • cmake minsizerel 后缀 d是什么以及怎么使用

    cmake是一个跨平台的开源编译系统。它可以根据不同的平台、编译器和其他参数来生成相应的Makefiles、Visual Studio工程或Xcode工程等。minsizerel是…

    编程 2025-04-27
  • Python文件选择对话框过滤文件后缀

    在编写Python程序时,我们常常需要打开和读取文件,但是我们并不希望读取某些特定格式的文件,这时候文件选择对话框就非常有用了。本篇文章将介绍如何使用Python的文件选择对话框并…

    编程 2025-04-27
  • 关系表达式的深度剖析

    一、关系表达式的定义 关系表达式是指在关系数据库中为实现数据的最大效用和最快速度的数据检索和存储而定义的语法,表达式中的每一个元素(关系、属性、常量等)均是数据库的基本结构。 二、…

    编程 2025-04-23
  • Java二元表达式:从基础到优化

    一、基础知识 Java二元表达式是指只有两个操作数以及一个运算符的表达式,例如1+2、a<b或 x*y 。在Java语言中,对二元表达式的处理十分重要且广泛,我们需要掌握基础…

    编程 2025-04-18
  • 切面表达式:细节决定成败

    一、切面表达式注解 注解是Java中非常重要的一种语法标记,Spring AOP中也通过注解的方式来定义切面。在定义切面时,可以使用@Aspect注解表示一个切面类,也可以使用@B…

    编程 2025-04-13
  • Cron表达式校验详解

    一、Cron表达式简介 Cron表达式是一种时间计划工具。它是由6或7个时间元素组成的字符串,用于指定时间表。 Cron触发器通常用于调度任务或批处理作业。 Cron表达式是指定执…

    编程 2025-04-12
  • 深入探究cron表达式验证

    一、验证cron表达式的重要性 1、cron表达式是一个非常常见的工具,用于定义如何在特定的间隔进行重复运行作业以及何时启动作业。 2、验证cron表达式的正确性非常重要,可以确保…

    编程 2025-02-25
  • Java表达式的全面解析

    一、操作符和操作数 在Java中,表达式是由操作符和操作数组成的。操作符分为算术操作符、关系操作符、逻辑操作符和位操作符。操作数可以是常量、变量、方法调用或者其他表达式。 //算术…

    编程 2025-02-17
  • 深入了解execution表达式

    随着Spring框架的不断发展,execution表达式作为Spring AOP切点表达式的核心语法之一,也逐渐成为了Java开发人员必备的技能之一。execution表达式主要作…

    编程 2025-02-17

发表回复

登录后才能评论