Java数据结构06----中缀表达式转换为后缀表达式

C++ 中缀表达式转后缀表达式 一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可       1.用字符数组存储整行输入的中缀表达式;       2.接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数         (暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);       3.如果是左括号,直接进符号... 阅读详情

本文主要内容:

  • 表达式的三种形式
  • 中缀表达式与后缀表达式转换算法

一、表达式的三种形式:

  • 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3。我们从小做数学题时,一直使用的就是中缀表达式。
  • 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *。又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符)
  • 前缀表达式:同后缀表达式一样,不包含括号,运算符放在两个运算对象的前面,如:* + 2 1 3 。前缀表达式和后缀表达式其实是差不多的,只不过符号位置不同而已,前缀表达式不是很常见。

 

二、中缀表达式转换为后缀表达式:(思路)

1、将中缀表达式转换为后缀表达式:(步骤,有点难理解)

(1)当读到数字直接送至输出队列中;

(2)当读到运算符t时:

  a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;

    注:这句话不好理解,可以说成这样,从栈顶开始,依次弹出比当前处理的运算符优先级高的运算符,直到一个比它优先级低的或者遇到了一个左括号就停止。

  b.t进栈;

(3)读到左括号时总是将它压入栈中;

(4)读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号;

(5)中缀表达式全部读完后,若栈中仍有运算符,将其送到输出队列中。

 

举例:

124b3dd7-f3b3-4110-904c-8a2b1d85dccd

上图中,左侧的那一列为输出序列,右侧的那一列为栈。

2、运用后缀表达式进行计算:

  (1)建立一个栈S;

  (2)从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中;

  (3)如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束。

举例:

3+(2-5)*6/3=-3 ,其后缀表达式为:325-6*3/+。其运算结果如下:

45270e43-7c61-4ac2-af8f-efb437e8d742

三、代码实现:将中缀表达式转换为后缀表达式

  • JDK  Stack类使用
  • 使用泛型

代码实现:

(1)StringToArithmetic.java:(中缀表达式转化为后缀表达式的工具类)

/**
 * Created by smyhvae on 2015/9/7.
 * 工具类:
 * 1、中缀表达式转化为后缀表达式
 * 2、给出一个算术表达式(中缀表达式),直接得到计算结果
 */

import java.util.Stack;
import java.util.regex.Pattern;

public class StringToArithmetic {

    private StringToArithmetic() {
    }

    //方法:给出一个算术表达式(中缀表达式),得到计算结果。 例如 (5+8+10)*1,返回23
    public static double stringToArithmetic(String string) {
        return suffixToArithmetic(infixToSuffix(string));
    }

    /**
     * 中缀表达式转后缀表达式 只处理了+,-,*,/和括号,没有处理负号及其它运算符,也没对前缀表达式验证。
     * 如要处理负号,可对表达式进行预转义处理,当下面条件成立时,将负号换成单目运算符"!" infix.charAt[i]=='-'&&(
     * i==0||infix.charAt[i-1]=='(')
     * 3*6/4+3
     * 3+6-4           3 6 + 4 -
     * 3+(6-4/2)*5    3 6 4 2 / - 5 * +
     */
    //方法:中缀表达式转成后缀表达式
    public static String infixToSuffix(String infix) {
        Stack<Character> stack = new Stack<Character>();
        String suffix = "";
        int length = infix.length();
        for (int i = 0; i < length; i++) {
            Character temp;
            char c = infix.charAt(i);
            switch (c) {
                // 忽略空格
                case ' ':
                    break;
                // 碰到'(',push到栈
                case '(':
                    stack.push(c);
                    break;
                // 碰到'+''-',将栈中所有运算符弹出,送到输出队列中
                case '+':
                case '-':
                    while (stack.size() != 0) {
                        temp = stack.pop();
                        if (temp == '(') {
                            stack.push('(');
                            break;
                        }
                        suffix += " " + temp;
                    }
                    stack.push(c);
                    suffix += " ";
                    break;
                // 碰到'*''/',将栈中所有乘除运算符弹出,送到输出队列中
                case '*':
                case '/':
                    while (stack.size() != 0) {
                        temp = stack.pop();
                        if (temp == '(' || temp == '+' || temp == '-') {
                            stack.push(temp);
                            break;
                        } else {
                            suffix += " " + temp;
                        }
                    }
                    stack.push(c);
                    suffix += " ";
                    break;
                // 碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号
                case ')':
                    while (stack.size() != 0) {
                        temp = stack.pop();
                        if (temp == '(')
                            break;
                        else
                            suffix += " " + temp;
                    }
                    // suffix += " ";
                    break;
                //如果是数字,直接送至输出序列
                default:
                    suffix += c;
            }
        }

        //如果栈不为空,把剩余的运算符依次弹出,送至输出序列。
        while (stack.size() != 0) {
            suffix += " " + stack.pop();
        }
        return suffix;
    }


    /**
     * postfix
     *
     * @return double
     */
    //方法:通过后缀表达式求出算术结果
    public static double suffixToArithmetic(String postfix) {

        Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)"); //使用正则表达式 匹配数字
        String strings[] = postfix.split(" ");  //将字符串转化为字符串数组
        for (int i = 0; i < strings.length; i++)
            strings[i].trim();  //去掉字符串首尾的空格
        Stack<Double> stack = new Stack<Double>();

        for (int i = 0; i < strings.length; i++) {

            if (strings[i].equals(""))
                continue;

            //如果是数字,则进栈
            if ((pattern.matcher(strings[i])).matches()) {

                stack.push(Double.parseDouble(strings[i]));
            } else {
                //如果是运算符,弹出运算数,计算结果。
                double y = stack.pop();
                double x = stack.pop();
                stack.push(caculate(x, y, strings[i])); //将运算结果重新压入栈。
            }
        }
        return stack.pop(); //弹出栈顶元素就是运算最终结果。

    }

    private static double caculate(double x, double y, String simble) {
        if (simble.trim().equals("+"))
            return x + y;
        if (simble.trim().equals("-"))
            return x - y;
        if (simble.trim().equals("*"))
            return x * y;
        if (simble.trim().equals("/"))
            return x / y;
        return 0;
    }
}

(2)Test.java:(测试类)

public class Test {
    public static void main(String[] args) {

        String str = "3+(2-5)*6/3";  //其后缀表达式为325-6*3/+

        //调用方法:中缀表达式转成后缀表达式
        System.out.println(StringToArithmetic.infixToSuffix(str));

        //调用方法:给出一个算术表达式(中缀表达式),得到计算结果
        System.out.println(StringToArithmetic.stringToArithmetic(str));

    }

}

上方代码中,第07行是根据中缀表达式算出后缀表达式。

第10行:是给出一个中缀表达式,直接的到计算结果,其实它的步骤是:先根据中缀表达式得到后缀表达式,然后根据后缀表达式去计算结果。

运行效果:

68bb3685-b736-4d3b-95ad-6a6981b80071


文章链接:http://www.cnblogs.com/smyhvae/p/4790373.html

用Java实现输入算数式计算值 ---中缀表达式转换为后缀表达式 基本要求 实现文本计算器,支持加减乘除、括号。 基本思路: 首先是先将输入的文本字符串 通过正则表达式转换为一个个字符 再将其转换为后缀表达式: 其中中缀表达式转换为后缀表达式 需要使用到栈的相关操作 还有一些基本的规则: 1.遇到操作数,直接输出; 2.栈为空时,遇到运算符,入栈; 3.遇到左括号,将其入栈; 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是... 阅读详情

相关推荐

JAVA数据结构及算法--解析算术表达式

JAVA数据结构及算法–解析算术表达式 1、本章内容主要参考于《Java数据结构和算法第二版》这本书。平时说的算术表达式就是中缀表达式,对计算机的算法来说如果要直接求算术表达式的值是比较困难的,所以可以按下面两步来实现算法会更容易: 将算术表达式转换成另一种形式:后缀表达式。可以参考《中缀表达式转后缀表达式 》 计算后缀表达式的值。会使用到栈的知识,可以参考《JAVA数据结构及算法–Stack应...

u013357557的专栏 2349

数据结构Java实现06----中缀表达式转换为后缀表达式

本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一、表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3。我们从小做数学题时,一直使用的就是中缀表达式。 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *。又比如3+(6-4/2)*...

weixin_33691700的博客 207

算术表达式中缀转后缀并计算结果

算法上机作业,将中缀表达式转为后缀表达式并且计算出表达式的结果

给定中缀算术表达式输出后缀形式(栈)

对任意给定的一个中缀算术表达式输出等价的后缀形式。(利用栈) 例如:1+2*3+(4*5+6)*7转换成 123*+45*6+7*+ #include <iostream> #include <map> #include <string> using namespace std; #define OK 1 #define ERROR 0 #define MAXSIZE 100 typedef int Status; typedef int ElemType;

weixin_52107400的博客 1675

YOLOv8环境搭建+训练自己的数据详细项目

直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\requirements.txt。首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口。到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt。然后安装ultralytics ,这是必须的。

m0_63172128的博客 2万+

3GPP LTE/NR信道模型

CDL(Clustered Delay Line):簇延迟线模型,包括CDL-A、CDL-B、CDL-C三个用于NLOS的信道模型,以及CDL-D、CDL-E两个用于LOS的信道模型。

LinkEverything的博客 1万+

Java实现中缀表达式转后缀表达式

逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)在实现中缀转后缀之前我们先了解后缀表达式的实现,学习过编译原理这门的课程的同学,应该对逆波兰式非常的熟悉哈,没错他就是后缀表达式。...

weixin_46073538的博客 1504

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...

本文主要内容:表达式的三种形式中缀表达式与后缀表达式转换算法一、表达式的三种形式:中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3。我们从小做数学题时,一直使用的就是中缀表达式。后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *。又比如3+(6-4/2)*5=23的后缀表达式为:3642...

weixin_39746282的博客 437

基于强化学习的工业SCR脱硝系统控制算法设计与实现

本文提出了一种基于强化学习的工业SCR脱硝系统智能控制方法。针对SCR系统存在的非线性、大滞后和多变量耦合等控制难点,研究采用混合建模方法构建了精度在5%以内的系统模型,并设计了专门的强化学习环境。该方法通过定义合理的动作空间和状态空间,结合物理约束设计损失函数,利用深度强化学习算法优化氨喷射控制策略。相比传统PID控制,该智能控制器能更好地适应烟气参数波动,实现NOx排放的稳定控制,为工业环保设施提供了更优的自动化解决方案。

huanghm88的专栏 1456

Mac版Burp Suite专业版破解与汉化完整指南

在Web安全测试领域,Java应用程序的许可证验证机制与本地化实现是常见的技术课题。其原理通常涉及Java Agent技术,通过在JVM启动时动态修改字节码,实现对软件授权状态的校验逻辑进行拦截与重写,从而绕过官方验证。同时,软件界面的国际化(i18n)与本地化(l10n)则依赖于资源文件的替换与加载。从技术价值角度看,深入理解这些机制不仅能满足特定场景下的工具定制需求,更能加深对Java安全机制、软件保护与逆向工程的理解。在实际的工程实践中,安全研究人员与开发者常面临功能受限或语言障碍的挑战,尤其是在渗透

weixin_29327525的博客 1046

CPU与DDR4内存链路全解析:频率、时序、SPD与故障排查

内存频率与时序是影响计算机性能的基础参数,而决定它们能否发挥真实水平的,是CPU内置内存控制器、主板BIOS、内存SPD与颗粒之间的协同链路。理解XMP、SPD与内存控制器的工作原理,能够帮助用户在装机时避开频率跑不满、开XMP黑屏重启等常见问题。从办公机到游戏平台,掌握CPU与DDR4内存的匹配思路与排查方法,既能提升系统稳定性,也能在CPU占用率异常时快速定位根因。围绕DDR4平台,系统梳理频率时序、SPD刷写、CPU与内存搭配及故障排查,为装机升级和问题诊断提供可落地的参考。

weixin_34186128的博客 314

secureCRT 破解方法

3、输入注册信息打开keygen.exe,点击path,选择SecureCRT的安装目录(例如D:\VanDykeSoftware\Clients)的securecrt.exe打开,继续下一步打开LicenseHelper.exe,如下。1、注册SecureCRT9.1打开keygen.exe,出现以下问题(没有关掉安全防护,一双击打开,Windows会自动识别keygen.exe为bingdu并删除)打开桌面SecureCRT,此界面不输入内容,直接点击下一步。2、存储配置文件夹(可以默认安装)

逆水行舟 1万+

06 中缀表达式转后缀表达式的详细步骤及代码实现

中缀表达式转换为后缀表达式 1. 步骤: 初始化:运算符栈 stack, 存储中间结果的列表 list; 从左至右扫描中缀表达式; 遇到操作数时,加入到 list 中; 遇到运算符时,比较其于 satck 栈顶运算符的优先级: (1)如果 stack 为空,或者栈顶运算符为 ( ,则直接将此运算符入栈; (2)否则,若优先级比栈顶运算符的高,将此运算符入栈; (3)否则,将 stack 栈顶的运算符弹出并加入到 list 中,再次转到 (4.1) 与新的栈顶运算符比较。 遇到括号时: (

朱古力的博客 651

ASPICE标准快速掌握「2.1. 过程能力概览」

一个项目的质量流程是否做的好最终会需要由一个指标来确定,ASPICE将其称为过程能力(Process capability),过程能力是一个综合的判定概念。而为了实现这个概念,ASPICE建立了一套完整的过程评估模型(Process Assessment Model),通过这套评估模型最终就能得出过程能力的最终得分。项目组根据这个得分不断改进和优化得分不足的方面,从而约束整个流程的各个方面来间接提升项目的最终质量。这里有三个关键术语:其中最主要的就是PAM,即过程评估模型,由ASPICE给出,该模型可以看成

雪云飞星的博客 1183

Agentic RL: 大模型后训练 SFT、PPO和GRPO

本文介绍了从LLM训练到Agentic RL的发展过程。传统LLM训练包括预训练和后训练两个阶段,其中后训练通过监督微调、奖励建模和强化学习等技术优化模型表现。针对智能体在复杂任务中的不足,提出了Agentic RL新范式,将LLM嵌入强化学习框架,通过多步交互、工具使用和环境反馈来优化长期目标。相比传统单轮对话优化(PBRFT),Agentic RL具有状态包含历史上下文、行动类型多样、动态状态转移等特点,更适合解决需要多步推理和规划的任务。这种新方法为开发更强大的智能体系统提供了可能。

Cachel Wood的博客 698

JAVA 数据结构-06 (3) 栈结构的应用 前 中 后缀三种表达式 中缀表达式转后缀表达式 逆波兰计算器实现和算法思路

JAVA 数据结构学习-05.栈 2. 栈结构的应用(表达式与计算器) 2.2 前 中 后缀三种表达式 前缀表达式(波兰表达式) 运算符位于操作数之前 举例:(3+4)*5-6的前缀表达式就是 - * + 3 4 5 6 计算机求值的流程:从右至左进行扫描,遇到数字,将数字压入堆栈,遇到运算符,弹出栈顶两个数,用运算符进行计算,并将结果压入栈,重复操作直到表达式最左端,最后得出的结果就是表达式的结果. 中缀表达式 最常见的运算表达式 (3+4)*5-6 对于计算机并不好操作( 需要判断相邻运算符

NeverGiveUp 236

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

表达式树—中缀表达式转换成后缀表达式(一)

表达式树—中缀表达式转换成后缀表达式(一) 前缀、中缀、后缀表达式的转换举例 前缀表达式:/+A*BCD。 中缀表达式:A+B*C/D。 后缀表达式:ABC*+D/。 中缀表达式转换后缀表达式算法 将栈初始化为空栈; 从左到右扫描表达式的每一个字符,执行下面操作:     2.1 遇到操作数:直接输出(添加到后缀表达...

码农皮邱 613

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

中缀表达式转化成后缀表达式,优化版本1

package org.structure.stack; import java.util.ArrayList; import java.util.Stack; /** * 中缀表达式转化成后缀表达式的过程 * @author cjj_1 * @date 2020-08-07 15:05 */ public class ToSuffix { public static void main(String[] args) { Stack<String> s1= ne

weixin_40128696的博客 178

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

尚硅谷Java数据结构与算法——039中缀表达式转后缀表达式

代码实现 package com.atguigu.stack; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * @author WHT * @create 2021-06-11 9:22 */ public class PolandNotation { public static void main(String[] args) { // 完成将一个中缀表达

qq_33790600的博客 247

3-06. 表达式转换(25)

3-06. 表达式转换(25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换

u011415955的专栏 699
上一篇: Java数据结构05----栈:顺序栈和链式堆栈
下一篇: Java数据结构07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
混魔MJM
博客等级 码龄9年 57粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值