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

数据结构与算法-(7)---栈的应用-(3)表达式转换

🌈write in front🌈
🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
📝个人主页:Aileen_0v0🧸—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:Aileen_0v0🧸的数据结构与算法学习系列专栏🌸——CSDN博客
🗼我的格言:"没有罗马,那就自己创造罗马💫~"

目录

​编辑

​编辑

回顾 🧸

​编辑

中缀表达式🀄

全括号表达式与前后缀表达式的关系🎡

中缀表达式转换为前后缀形式的方法🪐

通用的中缀转后缀算法⭐

利用中缀转后缀的操作流程🪂

转成后缀表达式对应的代码🚀



 

回顾 🧸

"温故而知新"

通过思维导图回顾一下我们学了什么,我们先学了什么是线性结构,栈(Stack)是一种抽象数据类型的线性结构,栈是什么,栈的特点以及操作步骤,我们还可以通过列表去实现栈,不过不同的栈顶其对应的时间复杂度也不同,了解完栈的基础知识点后我们开始学习栈的应用,栈可以用于

(1)匹配符号(Balance Symbols),

    (2)进制转换(Decimal conversion),

    (3)表达式转换(Experssion conversion)」

(1) 和 (2) 我们已经在前面的文章写过了:不记得知识点或者对前面内容感兴趣的小伙伴可以点击👉

🔗(1)http://t.csdnimg.cn/Ypv3q

🔗(2)http://t.csdnimg.cn/OLIJW

对应专栏数据结构与算法学习系列专栏🌸🔗:http://t.csdnimg.cn/6BQDo

中缀表达式🀄

我们通常看到的表达式如:B*C , 很容易就知道是B乘以C

像  这种操作符( operator ) 介于操作数 ( operand )中间的表示法,称为 "中缀" 表示法.

But sometimes 中缀表示法会 case confusion(引起混淆),如 "A + B * C"

是A+B然后再乘以C  还是B*C然后再加A?

为了消除混淆,人们引入"优先级"的概念

规定高优先级的操作符先计算
相同优先级的操作符从左到右依次计算这样A+B*C就没有疑义是A加上 B与C的乘积
同时
引入了括号来表示强制优先级括号的优先级最高,而且在嵌套的括号中,内层的优先级更高这样(A+B)*C就是A与B的和再乘以C


全括号表达式与前后缀表达式的关系🎡

虽然人们已经习惯了这种表示法,但计算机处理最好是能明确规定所有的计算顺序,这样无需处理复杂的优先规则
于是,我们引入全括号表达式:

在所有的表达式项两边都加上括号A+B*C+D,应表示为((A+(B*C))+D)
可否将表达式中操作符的位置稍移动一下?

例如中缀表达式A+B操作符移到前面,变为"+AB"
或者将
操作符移到最后,变为“AB+
我们就得到了表达式的另外两种表示法:"
前缀"和“后缀”表示法以操作符相对于操作数的位置来定义

这样A+B*C将变为前缀的"+A*BC"后缀的"ABC*+"为了帮助理解,子表达式加了下划线

前缀和后缀表达式中,操作符的次序完全决定了运算的次序,不再有混淆

所以在很多情况下,表达式在计算机中的表示都避免使用复杂的中缀形式

让我们先看看这些前中缀和后缀表达式

中缀表达式前缀表达式后缀表达式
A + B * C + D+ + A * B C DA B C * + D +
( A + B ) * ( C + D )* + A B + C DA B + C D + *
A * B + C * D+ * A B * C DA B * C D * +
A + B + C + D+ + + A B C DA  B + C + D +

想必初看的小伙伴会觉得眼花缭乱,但是不要着急,我们接下来会一一讲解.

一定得有个算法来转换任意复杂的表达式

为了分解算法的复杂度,我们从“全括号中缀表达式入手我们看A+B*C

如果写成全括号形式:(A+(B*C)),显式表达了计算次序我们注意到每一对括号,都包舍了一组完整的操作符和操作数,让我们看看如何将其转换成前后缀表达式吧~


中缀表达式转换为前后缀形式的方法🪐

✨Summary:

        (1)将中缀表达式转换为全括号形式

        (2)将所有的操作符移动到子表达式所在的 左括号(前缀prefix) 或者 右括号(后缀postfix) 处~

              替代之,再删除所有的括号.


通用的中缀转后缀算法⭐

在中缀表达式转换为后缀形式的处理过程中,操作符比操作数要晚输出

所以在扫描到对应的第二个操作数之前,需要把操作符先保存起来


而这些暂存的操作符,由于优先级的规则还有可能要反转次序输出.

在A+B*C中,+虽然先出现,但优先级比后面这个*要低,所以它要等*处理完后,才能再处理.


这种反转特性,使得我们考虑用保存暂时未处理操作符

再看看(A+B)*C,对应的后缀形式是AB+C*
这里+的输出比*要早,主要是因为括号使得+的优先级提升,高于括号之外的*


根据上面的“全括号”表达式,后缀表达式中操作符应该出现在左括号对应的右括号位置

所以遇到左括号,要标记下,其后出现的操作符优先级提升了,一旦扫描到对应的右括号,就可以马上输出这个操作符

总结:

在从左到右扫描逐个字符扫描中缀表达式的过程中,采用一个来暂存未处理的操作符
这样,栈顶的操作符就是
最近暂存进去的,当遇到一个新的操作符,就需要跟栈顶的操作符比较下优先级,再行处理--->新符号和栈顶对比,新的高,就入栈(因为取时也先取);       新的低,就把栈顶出栈,让栈顶的先运算.

利用中缀转后缀的操作流程🪂

后面的算法描述中,约定中缀表达式是由空格隔开的一系列单词(token)构成

操作符单词包括*/+-()

操作数单词则是单字母标识符A、B、C等。

1.首先,创建空栈opstack用于暂存操作符空表postfixList用于保存后缀表达式

2.将中缀表达式转换为单词(token)列表

    A + B*C = split => ['A', '+', 'B', ' * ', 'C']

图解: 

转成后缀表达式对应的代码🚀

class Stack:#Stack---->ADTdef __init__(self):self.items =[]def isEmpty(self):return self.items == []# 满足这些属性(行为)的是栈def push(self,item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items)-1]#def size(self):return len(self.items)def infixToPostfix(infixexpr):# 记录操作符优先级prec = {}prec["*"] = 3prec["/"] = 3prec["+"] = 2prec["-"] = 2prec["("] = 1opStack = Stack()postfixList = []# 解析表达式到列表tokenList = infixexpr.split()for token in tokenList:# 操作数if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":postfixList.append(token)#  (elif token == "(":opStack.push(token)#  )elif token == ")":topToken = opStack.pop()while topToken != '(':postfixList.append(topToken)topToken = opStack.pop()# 操作符else:while (not opStack.isEmpty()) and \(prec[opStack.peek()] >= prec[token]):postfixList.append(opStack.pop())opStack.push(token)while not opStack.isEmpty():#  操作符postfixList.append(opStack.pop())#  合成后缀表达式字符串   return " ".join(postfixList)
print(infixToPostfix("A + B * C "))

运行代码测试结果 :

相关文章:

数据结构与算法-(7)---栈的应用-(3)表达式转换

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...

Lilliefors正态性检验(一种非参数统计方法)

Lilliefors检验(也称为Kolmogorov-Smirnov-Lilliefors检验)是一种用于检验数据是否符合正态分布的统计检验方法,它是Kolmogorov-Smirnov检验的一种变体,专门用于小样本情况。与K-S检验不同,Lilliefors检验不需要假定数…...

【云原生】配置Kubernetes CronJob自动备份MySQL数据库(单机版)

文章目录 每天自动备份数据库MySQL【云原生】配置Kubernetes CronJob自动备份Clickhouse数据库 每天自动备份数据库 MySQL 引用镜像:databack/mysql-backup,使用文档:https://hub.docker.com/r/databack/mysql-backup 测试、开发环境:每天0点40分执行全库备份操作,备份文…...

基于PSO算法的功率角摆动曲线优化研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

数论知识点总结(一)

文章目录 目录 文章目录 前言 一、数论有哪些 二、题法混讲 1.素数判断,质数,筛法 2.最大公约数和最小公倍数 3.快速幂 4.约数 前言 现在针对CSP-J/S组的第一题主要都是数论,换句话说,持数论之剑,可行天下矣! 一、数论有哪些 数论 原根,素数判断,质数,筛法最大公约数…...

知识分享 钡铼网关功能介绍:使用SSLTLS 加密,保证MQTT通信安全

背景 为了使不同的设备或系统能够相互通信,让旧有系统和新的系统可以集成,通信更加灵活和可靠。以及将数据从不同的来源收集并传输到不同的目的地,实现数据的集中管理和分发。 通信网关完美克服了这一难题,485或者网口的设备能通过…...

asp.net core mvc区域路由

ASP.NET Core 区域路由(Area Routing)是一种将应用程序中的路由划分为多个区域的方式,类似于 MVC 的控制器和视图的区域划分。区域路由可以帮助开发人员更好地组织应用程序的代码和路由,并使其更易于维护。 要使用区域路由&#…...

KNN(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...

Servlet开发-session和cookie理解案例-登录页面

项目展示 进入登录页面,输入正确的用户名和密码以后会自动跳到主页 登录成功以后打印用户名以及上次登录的时间,如果浏览器和客户端都保存有上次登录的信息,则不需要登录就可以进入主页 编码思路 1.首先提供一个登录的前端页面&…...

Polygon Miden:扩展以太坊功能集的ZK-optimized rollup

1. 引言 Polygon Miden定位为zkVM,定于2023年Q4上公开测试网。 zk、zkVM、zkEVM及其未来中指出,当前主要有3种类型的zkVM,括号内为其相应的指令集: mainstream(WASM, RISC-V)EVM(EVM bytecod…...

[题]宝物筛选 #单调队列优化

五、宝物筛选&#xff08;洛谷P1776&#xff09; 题目链接 好家伙&#xff0c;找到了一个之前学习多重背包优化时的错误…… 之前记的笔记还是很有用的…… #include<bits/stdc.h> using namespace std; const int N 1e5 10; int f[N]; int n, m; int v, w, s; int l…...

.NET的键盘Hook管理类,用于禁用键盘输入和切换

一、MyHook帮助类 此类需要编写指定屏蔽的按键&#xff0c;灵活性差。 using System; using System.Runtime.InteropServices; using System.Diagnostics; using System.Windows.Forms; using Microsoft.Win32;namespace MyHookClass {/// <summary>/// 类一/// </su…...

Anaconda Jupyter

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言An…...

Unity中Shader的前向渲染路径ForwardRenderingPath

文章目录 前言一、前向渲染路径的特点二、渲染方式1、逐像素(效果最好)2、逐顶点(效果次之)3、SH球谐(效果最差) 三、Unity中对灯光设置 后&#xff0c;自动选择对应的渲染方式1、ForwardBase仅用于一个逐像素的平行灯&#xff0c;以及所有的逐顶点与SH2、ForwardAdd用于其他所…...

简历项目优化关键方法论-START

START方法论是非常著名的面试法则&#xff0c;经常被面试官使用的工具 Situation:情况、事情、项目需求是在什么情况下发生Task:任务&#xff0c;你负责的做的是什么Action:动作&#xff0c;针对这样的情况分析&#xff0c;你采用了什么行动方式Result:结果&#xff0c;在这样…...

TensorFlow学习1:使用官方模型进行图片分类

前言 人工智能以后会越来越发达&#xff0c;趁着现在简单学习一下。机器学习框架有很多&#xff0c;这里觉得学习谷歌的 TensorFlow&#xff0c;谷歌的技术还是很有保证的&#xff0c;另外TensorFlow 的中文文档真的很友好。 文档&#xff1a; https://tensorflow.google.cn/…...

C++ 并发编程实战 第八章 设计并发代码 一

目录 8.1 在线程间切分任务 8.1.1 先在线程间切分数据&#xff0c;再开始处理 8.1.2 以递归方式划分数据 8.1.3 依据工作类别划分任务 借多线程分离关注点需防范两大风险 在线程间按流程划分任务 8.2 影响并发性能的因素 8.2.1 处理器的数量 8.2.2 数据竞争和缓存兵乓…...

设计模式8、装饰者模式 Decorator

解释说明&#xff1a;动态地给一个对象增加一些额外的职责。就扩展功能而言&#xff0c;装饰模式提供了一种比使用子类更加灵活的替代方案 抽象构件&#xff08;Component&#xff09;&#xff1a;定义一个抽象接口以规范准备收附加责任的对象 具体构件&#xff08;ConcreteCom…...

抖音开放平台第三方代小程序开发,一整套流程

大家好&#xff0c;我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题&#xff0c;一套模板&#xff0c;随处部署。能尽可能地减少服务商的开发成本&#xff0c;服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…...

Flutter笔记:滚动之-无限滚动与动态加载的实现(GetX简单状态管理版)

Flutter笔记 无限滚动与动态加载的实现&#xff08;GeX简单状态管理版&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq…...

前端架构师之02_ES6_高级

1 类和继承 1.1 class类 JavaScript 语言中&#xff0c;生成实例对象的传统方法是通过构造函数。 // ES5 创建对象 // 创建一个类&#xff0c;用户名 密码 function User(name,pass){// 添加属性this.name name;this.pass pass; } // 用 原型 添加方法 User.prototype.sho…...

VScode多文件编译/调试配置

之前都是在Visual Studio写C/C&#xff0c;最近想换到VScode&#xff0c;折腾半天把launch.json和tasks.json配好了&#xff08;虽然不懂为什么&#xff0c;但确实能用了&#xff09;&#xff0c;在此做个记录。 参考资料&#xff1a;1&#xff0c;2&#xff0c;3 环境&#…...

K折交叉验证——cross_val_score函数使用说明

在机器学习中&#xff0c;许多算法中多个超参数&#xff0c;超参数的取值不同会导致结果差异很大&#xff0c;如何确定最优的超参数&#xff1f;此时就需要进行交叉验证的方法&#xff0c;sklearn给我们提供了相应的cross_val_score函数&#xff0c;可对数据集进行交叉验证划分…...

2023.09.30使用golang1.18编译Hel10-Web/Databasetools的windows版

#Go 1.21新增的 log/slog 完美解决了以上问题&#xff0c;并且带来了很多其他很实用的特性。 本次编译不使用log/slog 包 su - echo $GOPATH ;echo $GOROOT; cd /tmp; busybox wget --no-check-certificate https://go.dev/dl/go1.18.linux-amd64.tar.gz;\ which tar&&am…...

React简介

react作为前端主流框架之一&#xff0c;因其语法接近原生JavaScript语法而广受欢迎。其生态丰富&#xff0c;常用的就有react-router、react-redux等插件&#xff0c;还有与其匹配的UI组件库antd。而且其还有用于移动端开发的react-native库&#xff0c;因此&#xff0c;react值…...

链表经典面试题(一)

面试题 1.反转链表的题目2.反转链表的图文分析3.反转链表的代码实现 1.反转链表的题目 2.反转链表的图文分析 我们在实现反转链表的时候,是将后面的元素变前面&#xff0c;前面的元素变后面&#xff0c;那么我们是否可以理解为&#xff0c;用头插法的思想来完成反转链表呢&…...

体验亚马逊的 CodeWhisperer 感觉

CodeWhisperer 是亚马逊推出的辅助编程工具&#xff0c;在程序员写代码时&#xff0c;它能根据其内容生成多种代码建议。 CodeWhisperer 目前已支持近10几种语言&#xff0c;我是用 java 语言&#xff0c;用的开发工具是 idea&#xff0c;说一下我用的情况。 亚马逊云科技开发…...

6、行内元素和块元素

6、行内元素和块元素 一、块元素 无论内容多少&#xff0c;该元素独占一行 如p标签、标题标签&#xff08;h1-h6…&#xff09; 二、行内元素 内容撑开宽度、左右都是行内元素的可以排在一行 一些元素如果能够摆放在一行都可以用行内元素&#xff0c;但是如果需要换行就需…...

LeetCode 面试题 08.01. 三步问题

文章目录 一、题目二、Java 题解 一、题目 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模1000000007。 示例1: 输入&…...

[CSCCTF 2019 Qual]FlaskLight 过滤 url_for globals 绕过globals过滤

目录 subprocess.Popen FILE warnings.catch_warnings site._Printer 这题很明显就是 SSTI了 源代码 我们试试看 {{7*7}} 然后我们就开始吧 原本我的想法是直接{{url_for.__globals__}} 但是回显是直接500 猜测过滤 我们正常来吧 {{"".__class__}} 查看当前…...

阿里云域名备案网站建设方案书/公司推广渠道有哪些

在我们已经获得的所有HTML5和相关API中&#xff0c; WebGL可能是最有趣的。 有了它&#xff0c;我们就可以在浏览器中创建出色的3D环境&#xff0c;在本文中&#xff0c;我将向您详细介绍如何做到这一点。 特别是&#xff0c;我们将建立一个地球模型&#xff0c;使我们可以像一…...

个人做新闻网站/自媒体平台app

1.大概认识C类概念&#xff0c;基类&#xff0c;子类&#xff0c;继承&#xff0c;多态&#xff0c;封装&#xff0c;命名空间&#xff0c;迭代器&#xff0c;向量vector&#xff0c;异常处理&#xff0c;模板等概念&#xff0c;函数重载&#xff0c;list&#xff0c;map &…...

陕西中洋建设有限公司网站/深圳推广公司介绍

目录 哈希表改造 哈希表结构 仿函数实现 哈希表迭代器 结构 operator*和operator-> operator!和 operator 构造函数 拷贝构造 析构函数 拷贝构造 哈希表完整代码 unordered_set封装源码 unordered_map封装源码 哈希表改造 我们知道unordered_map…...

重庆市政府官网/搜索引擎优化理解

rom bs4 import BeautifulSoup import requests# 1.html页面解析的方法 """ 1)正则表达式 - 出神入化的正则&#xff1b;不懂前端&#xff08;re&#xff09; 2&#xff09;通过css选择器选中标签 - 熟悉css选择器&#xff1b;熟悉jQuery&#xff…...

网站制作公司网站建设/seo网络营销

上图&#xff1a; 解决方案&#xff1a; 从上述警告中可以看出&#xff0c;意思是我们的for循环中&#xff0c;缺少对应key&#xff0c;所以我们加上即可&#xff1a;...

网站建设中一般要多久/网页制作公司排名

提升自己的学历&#xff0c;现在这社会没点学历很不好混&#xff0c;提升学历的时候选择自己以后就业方向的专业选&#xff0c;然后不断提升这方向的能力&#xff0c;以后就业绝对比现在轻松舒服且还拿的多。 你基础不好&#xff0c;如果想提升学历可以选择去中专&#xff1f;或…...