【数据结构】栈和队列专题

前言

上篇博客我们讨论了栈和队列的有关结构,本篇博客我们继续来讨论有关栈和队列习题

这些题算是经典了

💓 个人主页:小张同学zkf

⏩ 文章专栏:数据结构

      若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章 ​

 

 

目录

1. 括号匹配问题 

2.用队列实现栈

3.用栈实现队列

4.设计循环队列


 

1. 括号匹配问题 

由题可知我们需要判断一对括号是否成立,成立的话,就返回true,失败的话就返回false,这道题乍一看不好判断,其实我们可以用栈来解决,栈是后进先出的原则,我们可以判断如果是左括号的话让这个括号进栈,如果是右括号的话,让栈里的括号出栈与右括号匹对,若匹对成功,则继续判断下一个括号,这里我们需要考虑极端情况,假如括号都遍历完了,栈内还有左括号,代表此时左括号多,不匹配,所以还需要判断栈是否为空,还有如果第一个入栈的括号若是右括号,必定不匹配,直接false。

思路已给出,代码如下

对于c语言来说,注意先把栈写好,写好后再调用栈的函数,后续c++就不用这么麻烦了


2.用队列实现栈

 

这道题就是给你两个队列,通过队列实现一个栈,我们都知道栈是后进先出的原则,而队列是先进先出的原则,那如何用两个队列实现栈那?

 

首先我们思考,假如现在有两个队列q1和q2,我们画图分析

根据图上操作要想实现栈的后进先出的原则,我们在入栈时先用一个队列q1来做入栈操作,若出栈,由于后进先出的原则,我们可以先把除最后一个元素,剩下的元素全部导入q2,然后再将还在q1的元素通过出队的方式实现出栈,若继续入栈,此刻元素都在q2那么就用q2实现入栈操作,然后出栈时,按照上面的操作来回导入就可以了。 

所以出栈比较难,其他操作都是常规的,我们说一下出栈,我们可以用假设法,分为空的队列和非空的队列,非空的队列前size-1的元素,pop出来再push进空的队列,再pop最后一个元素

对了,判空条件是两个队里都没元素时,此刻栈为空

代码如下


3.用栈实现队列

 

 两个队列可以实现栈,那两个栈如何实现队列那

队列是先进先出原则,那对于栈来说,后进先出,若两个栈,将第一个栈的所有元素全部导入第二个栈,此刻我们想想比如第一个栈原本1,2,3,4,现在导入第二个栈此刻是不是就是4,3,2,1,此刻第二个栈若出栈的话正好符合了队列的先进先出

我们可以在画图看一下

其实对于两个栈,将第一个栈导入另一个栈,原本第一个栈的元素是后进先出的原则,导入第二个栈就变成现进先出了

代码如下

 


4.设计循环队列

重头戏来了

循环队列,就是在一个有限空间里重复利用,如图

 

如图,我们用两个指针指向数组头,一个是队头指针head,一个是队尾指针tail,push数据时,tail++,相当于Tail指向的是最后一个元素的下一个位置·,这一点跟栈栈顶元素有点类似,当初始化为0时, 指针指向最后一个元素的下一个位置,pop的话移动头元素head就行了,不过上面的图不现实,因为队列空和满时对应的条件都一样,都是head=Tail,所以我们得找一个办法让这个条件不一样,才能判空

一种是用一个size变量加加,记录数据,这是一种方法。

其实还有另一种方法,我们可以多一个空间,开k+1个空间,但只能放k个元素

如图,此刻若放满正好是第四个图,相当于tail的下一个位置就是head,那么我们是不是可以根据取模得到关系(tail+1)%(k+1)==head达到这个条件就是满,空的条件就很简单,head==Tail

 

如果是返回尾元素,就是tail指针指向的上一个位置,tail-1,但是我们得考虑如上图这种情况,Tail回到前面,但是此刻tail-1越界了,所以这时我们可以根据取模,(Tail-1+k+1)%(k+1) 就得到了尾元素的位置

头元素就是head指向的元素

OK,剩下的操作就是常规操作,代码如下


 结束语

栈与队列经典习题就结束了,有什么问题可私聊我,里面的满足条件多想一想就能想明白,特别是最后一道题

OK,本篇博客结束!!!

 

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

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

相关文章

Linux内核发送网络数据

前言 我们开始今天对 Linux 内核⽹络发送过程的深度剖析。还是按照我们之前的传统,先从⼀段代码作为切⼊。 上述代码中,调⽤ send 之后内核是怎么样把数据包发送出去的。本⽂基于Linux 3.10,⽹卡驱动采⽤Intel的igb举例。 基础框架 我们看…

栅格地图、障碍物地图与膨胀地图(障碍物地图(三)写一张障碍物地图)

花了不少时间看完了障碍物地图的大致思路,这里简单根据前面的思路来写一个简易版的障碍物地图。 1.订阅一张地图 首先,我们需要一张静态地图作为原始数据,这个我们可以订阅当前的map来获取: void map_test1::MapCallback(const…

Ruby on Rails(Rails)

Ruby on Rails(通常简称为 Rails)无疑是Web开发领域中最受欢迎的Ruby框架之一。它深受开发者喜爱,原因在于其遵循的“约定优于配置”(Convention over Configuration, CoC)和“不重复自己”(Dont Repeat Yo…

财务分析软件怎么选?看这篇就够了

怎么才能选到一款真正能够用于财务分析的软件?且是能够又快又直观地将财务数据情况分析清楚,从不同角度灵活分析财务数据背后的关联的软件,简单来说那得选一款BI财务分析软件。具体哪款BI财务分析软件更合适?那就要从以下几个方面…

如何使用EasyExcel导入百万数据

摘要: 本文将详细探讨如何利用EasyExcel库,以及结合Java编程,高效地导入大规模数据至应用程序中。我们将逐步介绍导入流程、代码实现细节,并提供性能优化建议,旨在帮助读者在处理百万级别数据时,提高效率与…

VSCOde安装node.js环境

Visual Studio Code (VSCode) 本身并不直接安装 Node.js 环境,但 VSCode 提供了对 Node.js 开发的优秀支持,包括语法高亮、智能感知、调试等特性。要使用 VSCode 进行 Node.js 开发,你需要先独立安装 Node.js。以下是安装 Node.js 的步骤&…

几款打工人必备的AI绘图软件工具分享给你!

随着人工智能技术的不断进步,AI绘图软件工具成为了设计师和打工人提升工作效率的得力助手。这些工具不仅能够帮助我们快速完成复杂的绘图任务,还能激发我们的创意灵感。在本文中,我将为大家介绍几款打工人必备的AI绘图软件工具,其…

历史影像的下载办法总结

最近想要下黄河口的历史影像,试验了几个办法: 1)参考文献1中的办法,用Global Mapper下载World Imagery Wayback网站的历史数据,能下载从2014年至现在的; 2)参考文献1中的办法,用SA…

vue3中教你如何使用指令解决文本的溢出提示

在我们项目开发中,经常会有超长文本溢出提示,未溢出则不提示的场景。 在项目开发中遇到了比较复杂的场景,在一个组织树中,我们使用了el-tree来显示组织树,文字长度不一,太长的显示不全,刚开始我们使用滚动条,结果不好看 后来我们就直接再el-tree中添加el…

iOS copy的正确姿势

参考文章 知识准备(理解堆栈) 堆区: 程序员管理 若程序员不释放,由os释放不同于数据结构中的堆,堆区的结构类似于数据结构中的链表栈区: 由编译器来管理 存放函数参数值,局部变量的值等结构类似…

Facebook消息群发脚本的制作思路!

在数字化社交日益盛行的今天,Facebook作为全球最大的社交平台之一,为企业和个人提供了广阔的交流与合作空间。 然而,手动向大量用户发送消息既耗时又低效,因此,开发一款能够自动群发消息的脚本成为了许多人的需求&…

MySQL数据库的详解(2)

1、一对多 定义 案例:员工表为子表,部门表为父表一对多关系实现:在数据库表中多的一方,添加字段,来关联一的一方的主键。 外键语法 -- 创建表时指定 create table 表名(字段名 数据类型,...[constraint] [外键…

【正点原子Linux连载】 第四十二章 多点电容触摸屏实验摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1)实验平台:正点原子ATK-DLRK3568开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id731866264428 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

汇昌联信:拼多多网店该如何开店?

拼多多网店的开设流程并不复杂,但需要细心和耐心去完成每一步。下面将详细阐述如何开设一家拼多多网店。 一、选择商品与定位 开设拼多多网店的第一步是确定你要销售的商品类型,这决定了你的目标客户群体和市场定位。你需要了解这些商品的市场需求、竞争…

面向对象 06:三大特性之——多态,多态的基本概念和相关使用,关键字 instanceof,以及对象间的类型转换

一、前言 记录时间 [2024-05-14] 系列文章简摘: 面向对象 02:区分面向过程与面向对象,类和对象的关系 面向对象 03:类与对象的创建、初始化和使用,通过 new 关键字调用构造方法,以及创建对象过程的内存分析…

CAST: Cross-Attention in Space and Time for Video Action Recognition

标题:CAST: 时空交叉注意力网络用于视频动作识别 原文链接:2311.18825v1 (arxiv.org)https://arxiv.org/pdf/2311.18825v1 源码链接:GitHub - KHU-VLL/CASThttps://github.com/KHU-VLL/CAST 发表:NeurIPS-2023(CCF A…

【打字】打字训练之针对性键盘区域练习

本文章的核心点是:使用代码生成自己想要训练的键位的词汇,然后导入到打字软件针对性练习 一个程序员突然想纠正打字习惯源于腱鞘炎,虽然使用双拼打字已经不慢了,但是姿势不是很正确,导致了腱鞘炎。 所以想着好好纠正指…

Golang——http包

Go语言内置的net/http包十分优秀,提供了http客户端和服务器的实现。 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,所有的www文件都必须遵循这个标准。设计HTTP最初的目的是为了提供一种发布和…

消息队列选型

一、要解决的问题 1.1 异步 分析: 需要根据场景来判断。若整体链路的逻辑中,某些逻辑是不需要强实时的,滞后一段时间是允许的,同时又不会对用户带来不好的体验,那么可以使用MQ完成异步操作。 例如:秒杀场…

解锁客户需求密码:银行业数据分析在业务决策中的关键作用

一、引言 在数字化和大数据时代的浪潮下,银行业正经历着前所未有的变革。作为数据分析领域的资深专家,我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发,深入探讨相关业务场景下的数据分析应用,…