当前位置: 首页 > news >正文

【Note详细图解】中缀表达式如何转为后缀表达式?数据结构

中缀表达式

中缀表达式(中缀记法)是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。

前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。

后缀表达式

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。

中缀表达式转后缀表达式

中缀转后缀思路

  1. 初始化两个栈:运算符栈S1操作数栈S2
  2. 从左向右扫描中缀表达式
  3. 遇到操作数时,将其压入到操作数栈S2
  4. 遇到运算符时,比较其与运算符栈S1栈顶运算符的优先级
  5. 如果运算符栈S1为空,或栈顶运算符为左括号“ ( ”,或者优先级比栈顶运算符的优先级较高,则直接将此运算符压入栈中
  6. 否则,将运算符栈S1中栈顶的运算符弹入并压到操作数栈S2中,再次进行与运算符栈S1栈顶运算符的优先级比较
  7. 遇到括号时,如果遇到了左括号“ ( ”,则直接压入运算符栈S1
  8. 如果遇到右括号“ ) ”,则依次弹出运算符栈S1栈顶的运算符,并压入操作数栈S2,直到遇到左括号" ( "为止,此时将这一对括号丢弃
  9. 重复步骤2至8,直到表达式的最右边
  10. 运算符栈S1剩余的运算符依次弹出并压入操作数栈S2
  11. 拼接操作数栈S2中的元素并输出,结果即为中缀表达式所对应的后缀表达式

中缀转后缀图示

下图是以9-2*3+(5-2)*2为例子的完整过程。

中缀转后缀流程图

中缀转后缀代码分析

主函数

先初始化一下需要转化为后缀记法的字符串,然后给一个用来存储后缀表达式的数组,假设中缀转后缀的函数为MidtoLast,给这个函数传入中缀表达式的字符数组midstr,以及存储后缀表达式的字符数组laststr:

int main()
{char midstr[] = "9-2*3+(5-2)*2";//中缀表达式printf("中缀表达式为:%s\n", midstr);char laststr[100];//后缀表达式MidtoLast(laststr, midstr);printf("后缀表达式为:%s\n", laststr);return 0;
}

遇到操作数

遍历整个中缀字符串数组,遇到数字字符就直接进行存储,这里我们利用isdigit函数来判断是否数字字符,在下面相关总结的部分,会为大家详细讲解函数的使用方式,这里只先需要知道它的头文件是#include <ctype.h>

for (int i = 0; midstr[i] != '\0';)//i有的情况是不++的
{if (isdigit(midstr[i]))//数字字符直接放到后缀表达式里{laststr[j++] = midstr[i++];}
}

遇到运算符

在遇到运算符的时候:遇到第一个操作符就直接压入栈中,根据优先级来判断是谁先出栈谁后出栈,“*”“/”的优先级高于“+”“-”的优先级:

遇到括号

并且在遇到操作符(不是“)”)想要进栈,并且栈顶是“(”,就直接压入栈中:

for (int i = 0; midstr[i] != '\0';)//i有的情况是不++的
{else if (  top == 0 ||midstr[i] == '(' ||(midstr[i] == '*' || midstr[i] == '/') && (mystack[top - 1] == '+' || mystack[top - 1] == '-') || mystack[top - 1] == '(' && midstr[i] != ')'){mystack[top++] = midstr[i++];}	  
}

出栈

 遇到“)”,并且栈顶元素为“(”,则直接抵消:

for (int i = 0; midstr[i] != '\0';)//i有的情况是不++的
{else if (midstr[i] == ')' && mystack[top - 1] == '(')//直接抵消{i++;top--;}
}

剩余运算符全部出栈

将栈中的剩余元素都全部依次出栈:

else//直接出栈
{laststr[j++] = mystack[--top];
}while (top > 0)
{laststr[j++] = mystack[--top];
}laststr[j] = '\0';//变为字符串

中缀转后缀完整代码

#include <stdio.h>
#include <ctype.h>void MidtoLast(char* laststr, const char* midstr)
{int j = 0;//后缀表达式char mystack[100];//模拟栈int top = 0;//栈顶指针,当前可以存放数据的下标for (int i = 0; midstr[i] != '\0';)//i有的情况是不++的{if (isdigit(midstr[i]))//数字字符直接放到后缀表达式里laststr[j++] = midstr[i++];else if (top == 0 ||midstr[i] == '(' ||(midstr[i] == '*' || midstr[i] == '/') && (mystack[top - 1] == '+' || mystack[top - 1] == '-') ||mystack[top - 1] == '(' && midstr[i] != ')')mystack[top++] = midstr[i++];else if (midstr[i] == ')' && mystack[top - 1] == '(')//直接抵消{i++;top--;}else//直接出栈laststr[j++] = mystack[--top];}while (top > 0){laststr[j++] = mystack[--top];}laststr[j] = '\0';//变为字符串
}int main()
{char midstr[] = "9-2*3+(5-2)*2";//中缀表达式printf("中缀表达式为:%s\n", midstr);char laststr[100];//后缀表达式MidtoLast(laststr, midstr);printf("后缀表达式为:%s\n", laststr);return 0;
}

相关知识点

isdigit函数:

实例:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{char str[] = "1776ad";int year;if (isdigit(str[0])){year = atoi(str);printf("The year that followed %d was %d.\n", year, year + 1);}return 0;
}

运行结果: 

 

相关文章:

【Note详细图解】中缀表达式如何转为后缀表达式?数据结构

中缀表达式 中缀表达式&#xff08;中缀记法&#xff09;是一个通用的算术或逻辑公式表示方法&#xff0c;操作符是以中缀形式处于操作数的中间&#xff08;例&#xff1a;3 4&#xff09;&#xff0c;中缀表达式是人们常用的算术表示方法。 前缀或后缀记法不同的是&#xf…...

常用到的资源共享网站

1 资源共享 比你优秀的人都比你努力,你有什么理由不去努力。基础来自己的累秒累天累月的积累 没有一个人是从天而降的天才,也没有哪个人想做一个一生贫庸的人。今天我想说受人以鱼 不如受人以渔。 2 Java 开发软件的官网总结如下: Oracle Java 官网(https://www.oracle.com…...

关于JAVA中字节码文件版本号、产品版本号及开发版本号的关系

目录 关于字节码版本对应关系清单关于字节码格式说明的资料关于这些版本号 关于字节码版本 以二进制打开字节码文件&#xff1a; 如上图中第5-8标识&#xff08;圈起来的&#xff09;的即字节码版本号 十六进制&#xff1a; 34 十进制&#xff1a; 52 jdk 8 对应关系清单 …...

ModbusTCP 转 Profinet 主站网关在博图配置案例

兴达易控ModbusTCP转Profinet网关&#xff0c;在 Profinet 侧做为 Profinet 主站控制器&#xff0c;接 Profinet 设备&#xff0c;如伺服驱动器&#xff1b;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站&#xff0c;接 PLC、上位机、wincc 屏等。 拓…...

抖音上怎么挂小程序?制作小程序挂载抖音视频

公司企业商家现在已经把抖音作为营销的渠道之一&#xff0c;目前抖音支持短视频挂载小程序&#xff0c;可方便做营销。以下给大家分享这一操作流程。 一、申请自主挂载能力 首先需要在抖音开放平台官网注册一个抖音小程序账号&#xff0c;然后申请短视频自主挂载能力。 二、搭…...

AI新能量!FortiGate NGFW面向数据中心全面集成FortiGuard AI 安全服务

企业IT技术正在以惊人的速度发展&#xff0c;转型最大的领域之一是下一代防火墙&#xff08;NGFW&#xff09;市场。如今&#xff0c;混合云、多云、边缘等多种基础设施形态共存&#xff0c;已经成为大部分企业的常态&#xff0c;不断扩张的攻击面需要不同形态防火墙的安全防护…...

Git总结

Git介绍 一、Git常用命令 添加、提交 git add 将文件从工作区添加到暂存区&#xff0c;表示git开始追踪文件&#xff0c;如果不想让git追踪了&#xff0c;可以使用 git rm --cached <file> 取消文件追踪&#xff0c;仅仅只代表追踪取消&#xff0c;工作区文件还是照…...

初级前端面试题(一) 之 html/css/js

目 录 一、 HTML 1. .如何理解HTML语义化的&#xff1f; 2. HTML标签有哪些&#xff1f; 3. Canvas 和SVG的区别 二、CSS 1. BFC是什么&#xff1f; 2. 如何实现垂直居中&#xff1f; 3. css选择器 优先级如何确定&#xff1f; 4. 如何清除浮动&#xff1f; 5. …...

python实现excel的数据提取

一文带你实现excel表格的数据提取 今天记录一下如何使用python提取Excel中符合特定条件的数据 在数据处理和分析的过程中&#xff0c;我们经常需要从Excel表格中提取特定条件下的数据。Python的pandas库为我们提供了方便的方法来进行数据查询和过滤。 Pandas 是 Python 语言…...

Vue的MVVM实现原理

目录 前言 用法 代码和效果图 效果图 理解 高质量的使用 前言 MVVM是Model-View-ViewModel的缩写&#xff0c;是一种软件架构设计模式。Vue.js实现了这种设计模式&#xff0c;通过双向数据绑定和虚拟DOM技术&#xff0c;使得数据和视图能够快速响应彼此的变化。了解Vue的…...

vue+iView 动态侧边栏菜单保持高亮选中

iview 组件在使用过程中&#xff0c;多多少少有一些小坑&#xff0c;本文简单罗列一二&#xff1a; 避坑指南&#xff1a; 关于iview 侧边栏菜单未能展开高亮选中回显问题 应用场景&#xff1a;iview-admin下接入动态菜单后&#xff0c;刷新或链接跳入时回显失效 简单就是两个方…...

标准的听觉检测环境应满足哪些条件?

作者&#xff1a;兰明 医 学硕士&#xff0c;听力学 博士&#xff0c;听觉健康 门诊 主任。 听觉功能检测是一个计量的过程。国际和国家规定计量需要有一个标准的环境。目前有以下几种与听觉功能检测环境相关的国家标准或 /和国际标准&#xff1a; 1.《声学测听方法第1部…...

Fabric.js 样式不更新怎么办?

本文简介 带尬猴&#xff0c;我嗨德育处主任 不知道你有没有遇到过在使用 Fabric.js 时无意中一些骚操作修改了元素的样式&#xff0c;但刷新画布却没更新元素样式&#xff1f; 如果你也遇到同样的问题的话&#xff0c;可以尝试使用本文的方法。 是否需要重新绘制 我先举个例…...

【优选算法精品】前缀和

文章目录 一、前缀和前缀和问题一维前缀和模板二维前缀和模板 细节处理题目1思路细节处理&#xff1a; 题目2思路 题目3题目4题目5题目6总结 一、前缀和 前缀和问题 前缀和用来快速解决某一段连续区间的和。 时间复杂度O(1) 注意&#xff1a;不要背模板&#xff0c;不要背模…...

应用案例|基于高精度三维机器视觉引导机器人自动分拣包裹的应用

Part.1 行业背景 近年来&#xff0c;电商高速发展&#xff0c;百万件日订单处理的超大型分拣中心模式日益普及&#xff0c;传统的人工供包模式效率低&#xff0c;难以满足高超大分拣中心对分拣包裹的需求。随着科技的进步&#xff0c;自动供包系统进入大众视野&#xff0c;成为…...

Vue自定义指令实现按钮级的权限控制

通过v-指令&#xff0c;控制页面上的权限按钮的显示隐藏。首先是我的权限按钮数据&#xff0c;通过登录接口后端返回&#xff0c;前端将数据存在vuex里&#xff0c;在调用指令时候获取到当前页面对应的按钮权限数组&#xff0c;通过v-指令传递标识判断是否在当前页按钮权限数组…...

Selenium实现自动登录163邮箱和Locating Elements介绍

一. Selenium自动登录 代码如下所示: from selenium import webdriver from selenium.webdriver.common.keys import Keys import time #模拟登陆163邮箱 driver = webdriver.Firefox() driver.get("http://mail.163.com/") #用户名 密码 elem_user = …...

uniapp vue2、vue3 页面模板代码块设置

本文分享 uniapp vue2、vue3 页面模板代码块设置 设置路径 HBuilder X -> 工具 -> 代码块设置 -> vue代码块 -> 自定义代码块 如上图操作后在打开的 vue.json 文件的右侧“自定义代码块”中复制如下代码&#xff08;可全选替换也可添加到代码中&#xff09; 示…...

解决Linux下编译Intel oneTBB动态库出错的问题

在CMakeLists.txt中&#xff0c;原来有一段这样查找和链接的配置代码 find_library(tbblibaray ${tbb_path}) target_link_libraries(backalarm ${tbblibaray})编译后提示错误&#xff1a; /myapp/library/tbb/libtbb.so&#xff1a;对‘__cxa_throw_bad_array_new_lengthCX…...

分布式日志和链路追踪

分布式日志 实现思路 分布式日志框架服务的实现思路基本是一致的&#xff0c;如下&#xff1a; 日志收集器&#xff1a;微服务中引入日志客户端&#xff0c;将记录的日志发送到日志服务端的收集器&#xff0c;然后以某种方式存储数据存储&#xff1a;一般使用ElasticSearch分…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

StarRocks 全面向量化执行引擎深度解析

StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计&#xff0c;相比传统行式处理引擎&#xff08;如MySQL&#xff09;&#xff0c;性能可提升 5-10倍。以下是分层拆解&#xff1a; 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...