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

前言

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

这些题算是经典了

💓 个人主页:小张同学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…

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

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

几款打工人必备的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作为全球最大的社交平台之一,为企业和个人提供了广阔的交流与合作空间。 然而,手动向大量用户发送消息既耗时又低效,因此,开发一款能够自动群发消息的脚本成为了许多人的需求&…

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

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

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

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

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…

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

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

消息队列选型

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

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

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

UVa11419 SAM I AM

UVa11419 SAM I AM 题目链接题意分析AC 代码 题目链接 UVA - 11419 SAM I AM 题意 给出一个 RC 大小的网格,网格上面放了一些目标。可以在网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标,如下图所…

Java 环境变量未生效

在配置 Java 环境变量的时候,有可能会出现修改了JDK的路径,但是Java的环境变量没有相应切换的情况。比如: 但此时在控制台使用java -version命令输出的JDK版本不是新配置的版本,依然是之前的,甚至提示找不到java命令&a…

汇昌联信科技:拼多多电商的运营流程有哪些?

在当今互联网高速发展的时代,电商平台层出不穷,其中拼多多以其独特的团购模式和低价策略迅速崛起,成为众多消费者和商家的新宠。那么,拼多多电商的运营流程究竟包含哪些环节呢?接下来,我们将从商品上架、营销推广、订…

B/S版+java开发的医院绩效考核系统maven+Visual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键

B/S版java开发的医院绩效考核系统mavenVisual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键 医院绩效评价系统的建设,优化医院绩效管理体系,规范化工作目标的设计、沟通、评价与反馈,改进和提供医院管理人员的管理能力和成效&am…

【Web】HNCTF 2024 题解(部分)

目录 Please_RCE_Me ezFlask GoJava ez_tp GPTS Please_RCE_Me <?php if($_GET[moran] flag){highlight_file(__FILE__);if(isset($_POST[task])&&isset($_POST[flag])){$str1 $_POST[task];$str2 $_POST[flag];if(preg_match(/system|eval|assert|call|…

Linux进程间几种通信机制

一. 简介 经过前一篇文章的学习&#xff0c; 我们知道Linux下有两种标准&#xff1a;system V标准和 Posix标准。 System V 和 POSIX 标准是操作系统提供的接口标准&#xff0c;它们规定了操作系统应该如何实现一些基本功能&#xff0c;比如线程、进程间通信、文件处理等。 …