中缀转后缀

news2024/9/24 19:23:59

概念

  • 什么是后缀表达式?
    • 后缀表达式,其实就是一个中缀表达式 AOB => ABO (A、B是式子、O 为运算符),将运算符向后放

中转后举例

  • 中缀表达式:(a + b)* c - (d / c)

    • 首先,我们可以看到,在这个算式中,根据运算规则最先运算的是 括号中的内容,也就是 (a + b), 根据概念,此时 A = a、 B = b、 O = +,AOB=>ABO=>ab+

    • 其次,我们将 (ab+) 看作一个整体,式子变成 (ab+)c - (d/c),根据运算规则和优先级,我们可以发现接下来要运算的是 * , 此时A = (ab+)、 B = c 、O = * , AOB => ABO => ab+c

    • 紧接着,此式变成了 (ab+c*) - (d/c),根据运算规则和优先级,我们可以发现接下来要运算的是 / ,那么此时 A=d、B=c、O=/ 。AOB=>ABO=>dc/

    • 最后,此式变成了,(ab+c*) - (dc/),我们可以发现接下来要运算的是 - ,那么此时 A=(ab+c*)

      B= (dc/), O=- 。AOB=>ABO=>ab+c*dc/-(后缀表达式)

综上,我们可以看出,其实中缀转后缀,就是根据运算规则,找到我们表达式中最先计算的两项和运算符,然后,将其运算符放后边,并且要保持 A 和 B 的相对顺序不变,依次执行,直到转化成后缀表达式

中缀转后缀过程

详细规则:

  • 初始化一个栈,存储 运算符
  • 从左到右扫描(依次向后放字符)
    1. 遇到操作数。直接加入后缀表达式
    2. 遇到界限符。遇到 “(” 直接入栈,遇到 “)” 则依次弹出栈内运算符并加入后缀表达式,直到弹出 “(” 为止 。注意:“( )” 不加入后缀表达式
    3. 遇到运算符。依次弹出栈中优先级高于或者等于当前运算符的所有运算符,并加入后缀表达式,若碰到 “(” 或 栈空则停止。之后再把当前运算符入栈。
    4. 处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式

详细执行过程:

Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 100

// 运算符优先级函数
int precedence(char op) {
    if (op == '+' || op == '-') {
        return 1;
    } else if (op == '*' || op == '/') {
        return 2;
    } else {
        return 0;
    }
}

// 中缀转后缀实现
void infix_to_postfix(char* infix, char* postfix) {
    char stack[MAX_SIZE];						// 定义一个栈,用来存放 运算符
    int top = -1;								// 定义 栈顶指针
    int i, j;
    
    // 遍历中缀字符数组
    for (i = 0, j = 0; infix[i] != '\0'; ++i) {
        // 判断,如果是字符,将其存入后缀字符数组中
        if (infix[i] >= 'a' && infix[i] <= 'z') {
            postfix[j++] = infix[i];
        } else if (infix[i] == '(') {				// 如果是 左括号,放入栈中
            stack[++top] = infix[i];	
        } else if (infix[i] == ')') {				// 如果是 右括号
            // 将栈中 左括号之前的 运算符依次弹出,并进入后缀数组中
            while (top != -1 && stack[top] != '(') {
                postfix[j++] = stack[top--];
            }
            // 再减一次是为了:弹出 左括号
            top--; 
        } else {
            // 栈不空,并且当栈顶运算符优先级 大于等于 扫描到中缀运算符优先级,将栈中元素依次弹出,放入后缀数组中
            while (top != -1 && precedence(stack[top]) >= precedence(infix[i])) {
                postfix[j++] = stack[top--];
            }
            // 再将,扫描到中缀运算符,放入栈中
            stack[++top] = infix[i];
        }
    }
    
    // 当扫描完后,将栈中元素依次弹出,并放入后缀表达式数组中
    while (top != -1) {
        postfix[j++] = stack[top--];
    }
    
    // 设置字符数组结束符
    postfix[j] = '\0';
}

int main() {
    char infix[MAX_SIZE];
    char postfix[MAX_SIZE];
    
    printf("输入中缀表达式: ");
    scanf("%s", infix);
    
    infix_to_postfix(infix, postfix);
    
    printf("后缀表达式是: %s\n", postfix);
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CANoe学习笔记—关于cfg工程界面的分类

创建一个工程过程中&#xff0c;如何规划好界面设置&#xff0c;对于后续使用和维护起到了非常好的作用。故整理下 1&#xff1a;首先规划好大致结构图 CANoe中工程的规划Trace界面ConfigurationBuildInToolControlDiagnosticPanel预留 当然&#xff1a;此格式不是固定的&…

高级FPGA开发之基础协议PCIe

基础协议之PCIe部分 一、TLP包的包头 在PCIe的系统中&#xff0c;tlp包的包头的结构有许多部分是相似的&#xff0c;通过掌握这些常规的包头&#xff0c;能帮助理解在PCIe总线上各个设备之间如何进行数据的收发。 通用的字段 通用字段作用Fmt决定了包头是3DW还是3DW&#xff…

20240203在WIN10下配置stable-diffusion-webui.git

20240203在WIN10下配置stable-diffusion-webui.git 2024/2/3 11:55 【结论&#xff1a;在WIN10下&#xff0c;生成512x512分辨率的图像&#xff0c;大概需要9秒钟&#xff01;】 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;生成512x512分辨率的图像&#xff0c;大概需要1…

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小&#xff0c;填满屏幕&#xff0c;但不改变图片比例的需求&#xff0c;记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

Unity项目从built-in升级到URP(包含早期版本和2023版本)

unity不同版本的升级URP的方式不一样&#xff0c;但是大体流程是相似的 首先是加载URP包 Windows -> package manager,在unity registry中找到Universal RP 2023版本&#xff1a; 更早的版本&#xff1a; 创建URP资源和渲染器​​ 有些版本在加载时会自动创建&#…

【全网独创】2024美赛E题33页成品论文+1-4问完整代码数据助攻

E题社区抗灾能力综合评估与决策模型研究 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我们采用梯度提升树模型对社区基础设施、…

Node.js 模块化

一、介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 &#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他 模块使用 1…

【Java程序设计】【C00240】基于Springboot的班级综合测评管理系统(有论文)

基于Springboot的班级综合测评管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的班级综合测评管理系统 本系统分为学生功能模块、管理员功能模块以及教师功能模块。 管理员功能模块&#xff1a;管理员功能…

windows下安装go

下载golang Go 官网下载地址&#xff1a; https://golang.org/dl/ Go 官方镜像站&#xff08;推荐&#xff09;&#xff1a; https://golang.google.cn/dl/ 选择安装包 验证有没有安装成功 查看 go 环境 说明 &#xff1a; Go1.11 版本之后无需手动配置环境变量&#xff0c…

Vue 环境准备

1.安装vscode https://code.visualstudio.com/ 2.安装开发vue所需插件&#xff1a; Vetur —— 语法高亮、智能感知、Emmet等 包含格式化功能&#xff0c; AltShiftF &#xff08;格式化全文&#xff09;&#xff0c;CtrlK CtrlF&#xff08;格式化选中 代码&#xff0c;两…

【Matplotlib】figure方法之图形的保存

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

前端学习笔记 | 响应式网页+Boostrap

一、响应式网页 一套代码适应多端 1、媒体查询media(条件){css} max-width 小于等于max-width生效min-width 【案例】左侧隐藏 因为CSS的层叠性&#xff0c;书写顺序&#xff1a;max-width从大到小&#xff1b;min-width从小到大。 【媒体查询完整写法】 在html中link用于不同…

SpringBoot实战项目第一天

环境搭建 后端部分需要准备&#xff1a; sql数据库 创建SpringBoot工程&#xff0c;引入对应的依赖(web\mybatis\mysql驱动) 配置文件application.yml中引入mybatis的配置信息 创建包结构&#xff0c;并准备实体类 完成今日开发后项目部分内容如下图示 用户注册于登录部分…

大规模机器学习简介

1. 非线性回归问题 1.1 问题描述 我们有一组实验数据&#xff0c;每个实验都给出了输入和输出对 (Xn, Yn)。每个输入 是空间中的一个点&#xff0c;每个输出 是 空间中的一个点。这些数据点被假设为独立同分布&#xff08;i.i.d&#xff09;。 我们的目标是找到一个函数 fw&…

Power Designer的使用 创建数据库表模型

几年前用过PowerDesigner&#xff0c;好几年没用&#xff0c;有点忘记了&#xff0c;在这里记个笔记&#xff0c;需要的时候翻一翻 PowerDesigner版本16.5 下面的例子是以MySQL数据库为准 生成C#实体类 一 安装 1.1 安装 不让放网盘链接&#xff0c;审核通不过。。。。 …

前端学习之路(5) vue样式穿透

前言 vue的style中设置scoped属性后&#xff0c;组件实现样式私有化。 但是该组件又使用的其他组件库时(vant,elementui,自定义等)&#xff0c;该组件的style中的样式&#xff0c;优先级低&#xff0c;不生效&#xff0c;这个时候需要使用样式穿透(作用得更深)。 一、scoped底…

深度学习技巧应用35-L1正则化和L2正则在神经网络模型训练中的应用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用35-L1 正则化和L2正则在神经网络模型训练中的应用。L1正则化和L2正则化是机器学习中常用的两种正则化方法,用于防止模型过拟合并提高模型的泛化能力。这两种正则化方法通过在损失函数中添加惩罚项来控制模型的复杂性。…

Prometheus 采集Oracle监控数据

前言 oracledb_exporter是一个开源的Prometheus Exporter,用于从Oracle数据库中收集关键指标并将其暴露给Prometheus进行监控和告警。它可以将Oracle数据库的性能指标转换为Prometheus所需的格式,并提供一些默认的查询和指标。 download Oracle Oracle Windows Install …

2024年2月4日 十二生肖 今日运势

小运播报&#xff1a;2024年2月4日&#xff0c;星期日&#xff0c;农历腊月廿五 &#xff08;癸卯年乙丑月戊戌日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;兔、马、虎 需要注意&#xff1a;牛、鸡、龙 喜神方位&#xff1a;东南方 财神方位&#xff1a;正…

记录element-plus树型表格的bug

问题描述 如果数据的子节点命名时children,就没有任何问题&#xff0c;如果后端数据结构子节点是其他名字&#xff0c;比如thisChildList就有bug const tableData [{id: 1,date: 2016-05-02,name: wangxiaohu,address: No. 189, Grove St, Los Angeles,selectedAble: true,th…