数据结构:栈
什么是栈:
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。
代码实现:
public class Stack<T> implements Iterable<T>{//记录首个节点private Node head;//记录栈中个数private int N;public Stack() {head=new Node(null,null);N=0;}public void push(T t){ //元素入栈Node temp=head.next; //暂时保留目前栈顶元素head.next=new Node(t,temp);//相当于头插法N++; //元素个数+1}public T pop(){ //栈顶弹出元素Node temp=null;if (head.next==null){return null;}//删除首个元素temp=head.next;head.next=temp.next;N--;return temp.item; //temp就是被删除的元素}public int getSize() { //获取与元素个数return N;}@Overridepublic Iterator<T> iterator() {return new StackIterator();}private class StackIterator implements Iterator<T>{private Node n=head;@Overridepublic boolean hasNext() {return n.next!=null;}@Overridepublic T next() {Node node = n.next;n = n.next;return node.item;}}private class Node{private T item;private Node next;public Node(T item, Node node) {this.item = item;this.next = node;}}}public class TestStack {public static void main(String[] args) {Stack<String> stack=new Stack<>();stack.push("a");stack.push("b");stack.push("c");for (String s : stack) {System.out.println(s);}String pop = stack.pop();String pop2 = stack.pop();System.out.println("弹出了元素:"+pop);System.out.println("弹出了元素:"+pop2);}
}//运行结果
c
b
a
弹出元素:c
弹出元素:b
括号匹配问题:
思路:
通过一个栈结构,当匹配到一个“(”时进行入栈,然后当匹配到“)”就进行出栈操作。所以就会出现两种情况:
1.匹配到“)”进行出栈操作时,出栈元素为null,那么就表示在这之前没有匹配到“(”,表示不是严格按照()规则。
2.当字符串匹配完毕后,发现栈中仍然还有元素,那么就表示(和)数量不对等,同样也不是严格按照()规则。
代码:
public class BracketMatch {public static void main(String[] args) {String s="(上海((北京))";isMatch(s);}//括号匹配public static void isMatch(String str){Stack<String> stack=new Stack<>();for (int i = 0; i < str.length(); i++) {String s = str.charAt(i) + ""; //返回字符串元素if (s.equals("(")){ //匹配到一个左括号( 则入栈stack.push(s);continue;}if (s.equals(")")){ //如果匹配到) 括号String pop = stack.pop();if (pop==null){ //如果匹配到) 而弹出的栈是null时 那么就表示该字符串 不是严格的遵守()规则System.out.println("没有严格遵守()规则");}}}if (stack.getSize()!=0){ //如果栈中还剩有元素 那就代表(和)数量不对等 同样不符合规则System.out.println("没有严格遵守()规则");}else {System.out.println("该字符串是严格遵守()规则");}}
}
逆波兰求值问题:
中缀表达式:
中缀表达式就是日常生活中常用的表达式:如1+3*2,中缀表达式的特点就是二元运算符总是置于两个操作数的中间。而这种表达式对于计算机而言,就比较难以解决了,因为不同运算符有优先级问题,所以需要解析表达式语意等大量工作。所以为了解决该问题就引入了后缀表达式。
后缀表达式:
后缀表达式的特点就是运算符是在操作数(通常是两数)之后。
逆波兰式的求解过程可以用栈来实现。为了便于理解,举一个带数值的例子:
中缀表达式:6 * ( ( 5 + ( 2 + 3 ) * 8 ) + 3 )
首先,转化为逆波兰式: 6 5 2 3 + 8 * + 3 + *
首先,将前四个数依次入栈:
Top Of Stack ——————> | 3 |
2 | |
5 | |
6 |
然后,遇到第一个符号为加号,记录并弹出栈顶的两个元素,计算结果后压入栈中
Top Of Stack ——————> | 5 |
5 | |
6 |
继续操作,遇到便数字压入栈中,遇到符号,弹出栈顶两元素并压入其结果。
(特别提醒:在减法和除法的计算中,数字弹出顺序与其计算顺序刚好相反)
Top Of Stack ——————> | 288 |
代码实现:
public class ReversePolish {public static void main(String[] args) {//中缀表达式6 * ( ( 5 + ( 2 + 3 ) * 8 ) + 3 )//对应的后缀表达式String str="6523+8*+3+*";caculate(str);}public static void caculate(String str){Stack<String> stack=new Stack<>();for (int i = 0; i < str.length(); i++) {String s = String.valueOf(str.charAt(i));//进行运算符判断switch (s){case "+": //如果匹配到+ 则弹出栈顶的两个元素进行+Integer num1 = Integer.valueOf(stack.pop());Integer num2 =Integer.valueOf( stack.pop());Integer integer = num1 + num2;stack.push(String.valueOf(integer)); //将操作完的数再入栈break;case "-": //-和除需要注意顺序 应该是第二个弹出栈的-去第一个弹出栈的Integer minus1 = Integer.valueOf(stack.pop());Integer minus2 = Integer.valueOf(stack.pop());int minus = minus2 - minus1;stack.push(String.valueOf(minus));break;case "*":Integer mulit1 = Integer.valueOf(stack.pop());Integer mulit2 =Integer.valueOf( stack.pop());Integer mulit = mulit1 * mulit2;stack.push(String.valueOf(mulit));break;case "/"://-和除需要注意顺序 应该是第二个弹出栈的-去第一个弹出栈的Integer divide1 = Integer.valueOf(stack.pop());Integer divide2 = Integer.valueOf(stack.pop());int divide = divide2 / divide1;stack.push(String.valueOf(divide));break;default: stack.push(s); //如果是数字 则直接入栈break;}}for (String s : stack) {System.out.println(s); //打印最后元素}}}
相关文章:
数据结构:栈
什么是栈: 栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。 栈…...
tcp_recvmsg 函数
tcp_recvmsg 函数是 Linux 内核 TCP 栈的一部分,它主要用于处理从 TCP socket 接收数据的过程。这个函数的主要任务是从 TCP 接收队列中提取数据,并将这些数据拷贝到用户空间提供的缓冲区中。 以下是 tcp_recvmsg 函数的一般工作流程和功能解释: 函数签名和参数 int tcp_re…...
《数据结构》(应用题)
历年真题(09~24) 2009 最短路径(Dijkstra青春版) 【2009统考真题】带权图(权值非负,表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假设从初始顶点…...
阿里内部正式开源“Spring Cloud Alibaba (全彩小册)”
年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而,面试人群众多,技术市场却相对冷淡,面试的同学们不得不面临着 1 个…...
LeetCode题练习与总结:根据字符出现频率排序--451
一、题目描述 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。 返回 已排序的字符串 。如果有多个答案,返回其中任何一个。 示例 1: 输入: s "tree" 输出: "eert" …...
Excel VBA学习系列汇总20241205
整理几年工作中,实用VBA代码,绝对干货! 方便自己查询,方便大家学习, 有缘人可复制使用,记得分享给大家免费学习哦! 序历史文章1新学期开始,如何新学期开始,如何按成绩名次…...
给el-table表头添加icon图标,以及鼠标移入icon时显示el-tooltip提示内容
在你的代码中,你已经正确地使用了 el-tooltip 组件来实现鼠标划过加号时显示提示信息。el-tooltip 组件的 content 属性设置了提示信息的内容,placement 属性设置了提示信息的位置。 你需要确保 el-tooltip 组件的 content 属性和 placement 属性设置正…...
基于LLM智能问答系统【阿里云:天池比赛】
流程: 1、分别识别问题及提供的资料文件中的公司名实体,有公司名的走语义检索,无公司名的走结构化召回 2、结构化召回:Qwen根据问题生成sql,执行sql获取结果数值,把结果数值与问题给到Qwen生成最终结果 …...
k8s-Informer概要解析(2)
Client-go 主要用在 k8s 控制器中 什么是 k8s Informer Informer 负责与 kubernetes APIServer 进行 Watch 操作,Watch 的资源,可以是 kubernetes 内置资源对象,也可以 CRD。 Informer 是一个带有本地缓存以及索引机制的核心工具包&#x…...
Leetcode 3376. Minimum Time to Break Locks I
Leetcode 3376. Minimum Time to Break Locks I 1. 解题思路2. 代码实现 题目链接:3376. Minimum Time to Break Locks I 1. 解题思路 这一题我最开始的思路走的是贪婪算法的路子,优先走X的增长,不过很不幸失败了,后面还是暴力…...
介绍8款开源网络安全产品
01 HFish蜜罐 HFish是一款开源的蜜罐系统,用于模拟各种网络服务和应用,以吸引潜在的黑客攻击。它能够记录攻击尝试并收集攻击者的信息,从而帮助网络管理员识别潜在的威胁。HFish支持多种协议和服务,包括HTTP、FTP、SSH等&#…...
vue2面试题|[2024-12-5]
开题答辩终于结束了,又要开始我的前端面试学习啦!!! 1.v-model双向绑定原理 class Vue{constructor(options){this.$options optionsthis.$watchEvent {}if(typeof options.beforeCreate function){options.beforeCreate.bind…...
共筑数字安全防线,2024开源和软件安全沙龙即将启幕
随着数字化转型进程的加快以及开源代码的广泛应用,开源凭借平等、开放、协作、共享的优秀创作模式,逐渐成为推动数字技术创新、加速传统行业转型升级的重要模式。但随着软件供应链日趋复杂多元,使得其安全风险不断加剧,针对软件供…...
目标跟踪领域经典论文解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
SQL DQL数据查询语言(后续)
SQL DQL数据查询语言(后续) 1.子查询 在查询语句中的WHERE条件子句中,又嵌套了另外一个查询语句在返回列中嵌套一个查询 where条件中嵌套 要求:查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名select a.StudentNo,a…...
Gitee配置SSH公钥
采用SSH协议同步Git仓库代码的好处就是高效。在配置好SSH公钥后,不需要每次操作都要输入用户名和密码(主要针对命令行来说)。 以我个人项目为例。 生成 SSH 公钥 1. 通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t ed25519…...
机器学习——感知机模型
文章目录 前言1.感知机模型介绍1.1基本概念1.2数学表达1.3几何解释1.4优缺点 2.二分类应用2.1应用介绍2.2准备数据集2.2.1环境检查2.2.2数据集介绍2.2.3获取数据2.2.4划分数据集 2.3可视化训练集2.4训练过程2.4.1首轮梯度下降2.4.2多轮梯度下降 2.5可视化分类结果2.6在验证集验…...
如何选择安全、可验证的技术?
澳大利亚信号局的澳大利亚网络安全中心 (ASD 的 ACSC) 发布了一份指导文件,题为《选择安全和可验证的技术》,旨在帮助组织在采购软件(专有或开源)、硬件(例如物联网设备)和云服务(SaaS、MSP 服务…...
STL库中list的使用与迭代器的实现
STL库中list的使用与迭代器的实现 1.使用list中的部分函数assignspliceremoveuniquemeger 2.list的部分功能实现(重点)框架迭代器的实现 1.使用list中的部分函数 assign 功能一:当前链表的节点全部销毁,替换成迭代区间的值 功能二…...
android 常用三方框架
说实话, 我是比较讨厌三方框架的, 比如一个eventbus 底层逻辑就是个观察者模式,当然他的场景涵盖的比较丰富, 单从 单一原则来说, 还是一个简单的观察者模式就能解决问题, 何必要添加那么多文件到我们的项目…...
Browser.js断点续传上传
通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录点。上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分。 attention: 1、 当您使用webpack或browserify等打包工具…...
Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速,租房市场日益繁荣&a…...
了解Cocoa Touch框架与主要组件
Cocoa Touch框架详解及其主要组件 一、Cocoa Touch框架概述 Cocoa Touch框架是苹果公司为iOS应用程序开发提供的一套完整的框架,它基于Cocoa框架,并专为触控设备如iPhone、iPad等设计。这套框架不仅包含了构建图形用户界面(GUI)…...
ISO45001职业健康安全管理体系涵盖了丰富的内容
范围与术语 适用范围:明确规定了该标准适用于任何有愿望建立、实施和保持职业健康安全管理体系的组织,旨在使组织能够通过管理体系的有效运行,预防和控制职业健康安全风险,持续改进职业健康安全绩效。术语定义:对职业…...
Spring Boot 整合 Druid 并开启监控
文章目录 1. 引言2. 添加依赖3. 配置数据源4. 开启监控功能5. 自定义 Druid 配置(可选)6. 访问监控页面7. 注意事项8. 总结 Druid 是一个由阿里巴巴开源的高性能数据库连接池,它不仅提供了高效的连接管理功能,还自带了强大的监控和…...
【JAVA高级篇教学】第一篇:Springboot对接通义千问大模型
博主今天打算讲解下Java如何对接阿里云的通义千问大模型,可以自己玩玩ai问答之类的! 目录 一、发展历程 二、API-KEY的获取与配置 三、引用SDK 四、文本模型 1.代码 2.返回数据 3.官方代码案例 五、通义千问VL 1.计量计费 六、查看API-KEY调用额…...
【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】
卸载 MySQL 参考文章: 完美解决Mysql彻底删除并重装_怎么找到mysql并卸载-CSDN博客使用命令卸载mysql_卸载mysql服务命令-CSDN博客 先管理员方式打开 cmd ,切换到 MySQL 安装目录的 bin 文件夹下,执行如下命令,删除 MySQL 服务 my…...
Next.js 系统性教学:深入理解缓存与数据优化策略
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 前言 1. 缓存的基本概念 1.1 缓存的作用 1.2 Next.js 中的缓存策略 2. Next.js 的缓存机制 2.1 请求记忆化(Request Memoization) 2.1.1 什…...
JAVA数据结构
1.数组 (Array): 固定大小的容器,用于存储相同类型的元素,数组在内存中是连续存储的,支持通过索引快 速访问元素。 int[] numbers = new int[10]; numbers[0] = 1;2.Java Collections Framework (JCF) JCF提供了一组接口和类用于管理和操作集合(如列表,集合,…...
力扣第96题 不同的二叉搜索树
力扣第96题 - 不同的二叉搜索树 题目描述 给定一个整数 n,求以 1 到 n 为节点组成的所有 不同的二叉搜索树(BST) 的个数。 题目分析 二叉搜索树的性质 对于一个二叉搜索树,以 i 为根节点: 左子树的节点值来自 [1, i…...
在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!
你好,年轻的学徒!🧑💻 是时候踏上进入Java开发世界的史诗之旅了,我们的得力助手将是强大的IntelliJ IDEA。准备好了吗?出发吧! 在我们开始之前,我们需要下载这个工具。但是&#…...
【C语言】18. 自定义类型:结构体类型
文章目录 前言:一、结构体类型的声明1、结构体回顾1)结构的声明2)结构体变量的创建和初始化 2、结构的特殊声明3、结构的⾃引⽤ 二、结构体变量的创建和初始化1、对⻬规则2、为什么存在内存对⻬?3、修改默认对⻬数 三、结构成员访问操作符1、…...
智能租赁管理系统助力规范化住房租赁市场提升用户体验
内容概要 在当今的住房租赁市场中,智能租赁管理系统应运而生,为房东和租客带来了前所未有的便利。这套系统就像一位全能助手,将租赁信息、监管机制以及在线签约功能集成在一起,让整个过程变得流畅而高效。换句话说,您…...
ERROR: KeeperErrorCode = NoNode for /hbase/master
原因分析 通过上面的情景模拟,我们可以看到报错的原因在于zookeeper中出现问题,可能是zookeeper中的/hbase/master被删除,或者是在hbase集群启动之后重新安装了zookeeper,导致zookeeper中的/hbase/master节点数据异常。 1. 停止…...
springboot第84集:Java进阶之路, Netty
# kafka-map文件夹 cd /usr/local/kafka-map # 根据需求自行修改配置 vi application.yml # 启动 java -jar kafka-map.jar byte minByte -128; byte maxByte 127; 用于表示一个 8 位(1 字节)有符号整数。它的值范围是 -128(-2^7࿰…...
DevOps持续集成
DevOps流程 第一步安装git 关闭防火墙 systemctl stop firewalld cd /usr/loacl vim docker-compose.yml docker search gitlab 拉取gitlab镜像 2.33GB docker pull gitlab/gitlab-ce:latestvim docker-compose.yml修改docker-compose.yml version: 3.1 services:gitlab:i…...
sql server log文件
确定 SQL Server 实例中具有大量 VDF 的数据库 SELECT [name], COUNT(l.database_id) AS vlf_count FROM sys.databases AS s CROSS APPLY sys.dm_db_log_info(s.database_id) AS l GROUP BY [name] HAVING COUNT(l.database_id) > 100; 在收缩日志文件之前确定事务日志中…...
pip install报错 Missing dependencies for SOCKS support的正确解决办法:离线安装pysocks
今天准备开发python项目的时候,发现在pip install 的时候报错了,提示:Missing dependencies for SOCKS support,查遍csdn所有的回答都统一是只需要执行: unset all_proxy unset ALL_PROXY 然后再执行 pip install p…...
嵌入式学习(15)-stm32通用GPIO模拟串口发送数据
一、概述 在项目开发中可能会遇到串口不够用的情况这时候可以用通过GPIO来模拟串口的通信方式。 二、协议格式 按照1位起始位8位数据位1位停止位的方式去编写发送端的程序。起始位拉低一个波特率的时间;发送8位数据;拉高一个波特率的时间。 三、代码 …...
AKE 安全模型:CK, CK+, eCK
参考文献: [BCK98] Mihir Bellare, Ran Canetti, Hugo Krawczyk. A Modular Approach to the Design and Analysis of Authentication and Key Exchange Protocols (Extended Abstract). STOC 1998: 419-428.[CK01] Ran Canetti, Hugo Krawczyk. Analysis of Key-E…...
【Linux】通过crond服务设置定时执行shell脚本,实际执行时间却延迟了8小时
一、问题描述 通过使用crond服务设置定时任务,在每天凌晨的2:00执行脚本,但检查结果时发现,实际执行时间却在上午10点。 检查shell脚本执行结果发现,实际执行脚本时间在上午10:00,延迟了8小时。 检查系统时间…...
什么是云原生数据库 PolarDB?
云原生数据库 PolarDB 是阿里云推出的一款高性能、兼容性强、弹性灵活的关系型数据库产品。它基于云原生架构设计,结合分布式存储和计算分离的技术优势,为用户提供强大的计算能力、卓越的可靠性以及高性价比的数据库解决方案。PolarDB 适合各种业务场景&…...
(6)JS-Clipper2之ClipperOffset
1. 描述 ClipperOffset类封装了对打开路径和关闭路径进行偏移(膨胀/收缩)的过程。 这个类取代了现在已弃用的OffsetPaths函数,该函数不太灵活。可以使用不同的偏移量(增量)多次调用Execute方法,而不必重新分配路径。现在可以在一次操作中对开放和封闭路…...
基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)
基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0095 1. 主要功能: 基于51单片机的病床呼叫系统proteus仿…...
工业智能网关如何为企业实现智能制造赋能?
在数字化转型的浪潮中,工业智能网关作为连接物理世界与数字世界的桥梁,正逐步成为智能制造领域的核心组件。本文将通过一个实际使用案例,深入剖析工业智能网关如何助力企业实现生产流程的优化、数据的高效采集与分析,以及智能化决…...
【Spring项目】表白墙,留言板项目的实现
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:项目实现准备 1:需求 2:准备工作 (1)…...
Java-WebSocket
文章目录 WebSocket概念SpringBoot实现一个WebSocket示例STOMP消息订阅和发布后端主动发送消息 跨域 WebSocket概念 应用层协议,底层采用TCP,特点:持续连接,有状态,双向通信 当客户端想要与服务器建立WebSocket连接时…...
C#请求https提示未能为 SSL/TLS 安全通道建立信任关系
System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系 ,这个错误通常表明你的应用程序在尝试建立一个安全的 SSL/TLS 连接时遇到了问题。这通常是由于证书验证失败引起的。证书验证失败可能有几个原因: 证书不受信任&#…...
pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具
一、简介 MinerU是开源、高质量的数据提取工具,支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面,适用于学术、商业、金融、法律等多领域,提高数据获取效率。一站式、开源、高质量的数据提取工具&…...
人工智能与机器学习:真实案例分析及其在各行业的应用前景
目录 引言 人工智能与机器学习的基础概念 人工智能的历史与演变 机器学习的算法分类 深度学习与传统机器学习的区别 行业应用案例分析 医疗健康 疾病预测与诊断 影像识别的运用 案例:IBM Watson在肿瘤治疗中的应用 金融服务 风险评估与欺诈检测 投资预测…...