栈和队列经典面试题详解

目录

题目一:20. 有效的括号 - 力扣(LeetCode)

题目二:225. 用队列实现栈 - 力扣(LeetCode)

题目三:232. 用栈实现队列 - 力扣(LeetCode)

题目四:622. 设计循环队列 - 力扣(LeetCode)


上一次我们详细讲解了栈和队列的实现,今天我们就来讲一下栈和队列的经典面试题目,以强化我们对栈和队列的理解。话不多说,我们来看题目。

题目一:20. 有效的括号 - 力扣(LeetCode)

这道题目就是一道经典的用栈来解决的问题,我们用c来实现的话就要先实现栈的各种函数,上篇文章我们已经讲过了,这里就不在赘述。

思路:用s指针遍历s,当*s为'('  或 ‘[’ 或  '{' 时进栈,当*s为‘)’或'['或'{'时出栈,然后进行匹配,匹配不成功直接返回false,匹配成功继续匹配,如栈为空且s正好遍历完数组,则返回true。

由于栈具有后进先出的特点,完美的契合了这道题目。代码如下:

这一部分代码是栈的实现,需要注意的一点是要把STDataType改成char,别的和我们之前讲过的一模一样,接下来是接口函数的实现:

大家看一下段代码正不正确,左括号入栈,有括号则出栈匹配,匹配不成功返回false,出while循环代表所有的左括号都匹配成功,返回true。

看似逻辑没有问题,那么我们运行一下代码:

这是什么情况?当s数组只有一个'['时解答错误,遇到错误不要慌张,我们来一步一步的读写代码,来找错误:

*s开始为'['进入while循环,入栈,s++, *s此时为'\0',出while循环,直接返回true。

哦!原来我们漏了一种情况:出了while循环栈不为空,虽然此时已经遍历完了数组,但是栈不为空说明有括号落单没有匹配,所以我们应该在while循环外加上判空的判断,代码如下:

这下代码就正确了。

题目二:225. 用队列实现栈 - 力扣(LeetCode)

这道题目让我们用两个队列来实现一个栈。

栈是后进先出,队列是先进先出,那么怎么用两个队列实现栈呢?

思路:两个队列,q1,q2,保持一个队列不为空(进数据),另一个队列为空(出队列);进行出栈操作时则把不为空的队列的数据剪切到为空的队列中直至剩余最后一个元素停止,然后把删除初始时不为空的队列的最后一个元素,从而完成出栈的模拟。

代码如下:

这段代码在模拟栈的删除时,我们采用了假设法,希望大家能够好好理解理解,这个方法可以一定程度上的优化代码,什么?if...... if?通俗易懂的代码!!!

这段代码我们采用了结构体套结构体的方法,俗称“套娃”:

用obj结构体指针指向MyStack结构体,而MyStack结构体又由结构体Queue q1和Queue q2组成,不要被搞晕了,示意图如下:

还有就是myStackFree函数,要清楚的知道动态开辟的内存都有哪些,可不敢free非动态开辟的内存,也可不敢直接free(obj),这样动态开辟的链表找不到了,不就造成内存泄漏了吗?正确的做法是先调用QueueDestroy释放掉两个链表,然后在释放obj。

怎么说呢,这道题目没有什么实践意义,但是有一定的教学意义,能让我们更好的理解栈和队列。

题目三:232. 用栈实现队列 - 力扣(LeetCode)

这道题目与题目二大同小异,我们创建两个栈:stpush和stpop,stpush负责进入数据,stpop负责出数据。

入数据,就是stpush的入栈操作。又小伙伴会说,不对啊:你这样数据不就进入一个栈了吗?不成了后进先出了吗?

别急,当出数据时,我们和题目二一样进行导数据:把stpush的数据“剪切”到stpop中,这时原来元素的顺序就反过来了,我们在把stpop的栈顶数据删除,就模拟实现了队的出队操作。

思路示意图如下:

入队:

出队:

需要注意的一点是,在进行出队导数据时,我们要先看一下stpop栈中是否有数据,如果有的话就直接删除stpop栈顶数据即可,不可在把stpush中的数据导入进去,否则就会引起顺序错误:

知道了思路后,我们来写代码:

要说的一点是我们在实现出队函数时调用了Peek函数,简化了代码,销毁时还是要注意那块是动态开辟的内存,哪块不是,一定要仔细。

这道题目也是没有实践意义,但是有一定的教学意义。

题目四:622. 设计循环队列 - 力扣(LeetCode)

这是一道非常经典的题目,创建循环队列可以用数组和链表,笔者这次用数组来实现。

我们创建了一个循环队列的结构体,结构体成员变量如上图所示,head和tail可以让我们通过数组下标来访问循环队列收尾元素。

怎么通过数组实现呢?假设队列固定最多有5个元素,当head超过5时让它模5重新指向头即可。

这样就做到首尾相连了

那么当循环队列为满和为空判定条件是什么?

坏事儿了!我们上面的思路队列为满和队列为空时都是head==tail。这该怎么办呢?我们可以额外多开辟一个空间。即队列最大容量为5时我们开辟6个元素的空间。

这样的话我们再来看看队列为满和队列为空时tail和head的关系:

为空:

仍然是head==tail;

为满:

情况二是情况一经过:出队,出队,入队,入队 操作形成的。

这两种情况统一都是:(tail+1)%(k+1)==head。

知道了思路,代码写起来就比较简单了:

入队:入队时要先判断队列满不满,不满则插入数据,插入数据直接往a[tail]位置插入,更新tail的位置:tail=(tail+1)%(k+1).模上k+1的原因是tail有可能表示数组的最后一个位置,加一会变为初始位置。

出队:出队操作,最后要更新head的位置,同样,head可能最开始就表示最后一个位置,也要模上k+1。

总之,就是要注意head和tail的值在0到k这个范围变化。

以上就是全部内容,希望大家能有所收获。

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

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

相关文章

2024年最新软件测试面试题必问的1000题!

我了解的测试理论和方法包括以下几个方面: 黑盒测试与白盒测试: 黑盒测试:基于对软件系统外部行为进行测试,独立于内部代码实现细节。黑盒测试关注输入与输出之间的关系以及软件功能是否符合预期。白盒测试:基于对软件…

C语言简要(一)

总得让她开心吧 helloworld #include <stdio.h>int main() {printf("hello world!\n");return 0; } 程序框架 #include <stdio.h> int main {return 0; }输出 printf("hello world!\n"); "里面的内容叫做“字符串”&#xff0c;prin…

基于Springboot+Vue的Java项目-宠物商城网站系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

AI图像生成-基本步骤

模型板块 1、新建采样器&#xff1a;新建节点-》采样器-》K采样器 2、拖动模型节点后放开&#xff0c;选择checkpoint加载器&#xff08;简易&#xff09;&#xff0c;模型新建成功 提示词板块 1、拖动正面条件节点后放开&#xff0c;选择CLIP文本编码器&#xff0c;模型新建…

43k Star!推荐一款功能强大的开源笔记软件!

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

dubbo复习:(3) 服务超时时间配置

在dubbo admin中 可以进行类似如下配置 configVersion: v2.7 enabled: true configs:- side: consumeraddresses:- 0.0.0.0parameters:timeout: 55这样配置之后&#xff0c;当服务端响应超过55毫秒时&#xff0c;在服务消费者的控制台就会看到超时信息

【定制化】在Android平台实现自定义的程序启动页

特别说明&#xff1a;以下仅适用于Android平台。 实现原理 创建安卓端自定义的Activity禁用UnityPlayerActivity的启动Logo改用自定义Activity 示例效果 参考简单步骤或详细步骤都可实现。 自定义的启动动画&#xff0c;效果如下&#xff1a; 简单步骤 三步操作实现启动动画…

Jmeter+Grafana+Prometheus搭建压测监控平台

本文不介绍压测的规范与技术指标&#xff0c;本文是演示针对Jmeter如何将压测过程中的数据指标&#xff0c;通过Prometheus采集存储&#xff0c;并在Granfan平台进行仪表盘展示; 介绍 系统压测属于日常项目开发中的一个测试环节&#xff0c;使用测试工具模拟真实用户行为&…

27.哀家要长脑子了!

目录 1.316. 去除重复字母 - 力扣&#xff08;LeetCode&#xff09; 2. 1209. 删除字符串中的所有相邻重复项 II - 力扣&#xff08;LeetCode 哎哟 烦死了 刚刚不小心退出又没保存 又要写一遍 烦死了 最近刷题不得劲啊 感觉这脑子没长一点 1.316. 去除重复字母 - 力扣&am…

VMware Workstation 安装CentOS Linux操作系统

1.我们已经下载好VMware 创建新的虚拟机 2.选择典型 3.安装程序光盘映像文件 4.配置用户名密码 5.命名虚拟机&#xff0c;并确定位置 6.如图所示设置 7.等待&#xff08;时间会有点久&#xff09; 8.输入密码登入账号

【软件测试】需求概念|软件的⽣命周期|开发模型|测试模型

目录 推荐 一、什么是需求 1.1 ⽤⼾需求 1.2 软件需求 二、开发模型 2.1 什么是“模型” 2.2 软件的⽣命周期 2.3 常⻅开发模型 2.3.1 瀑布模型 2.3.2 螺旋模型 2.3.3 增量模型、迭代模型 2.3.4 敏捷模型 2.4 测试模型 2.4.1 V模型 2.4.2 W模型(双V模型&#xff0…

恭喜莱佛士设计学院学生成功入围第13届Hiiibrand Awards

第十三届Hiiibrand Awards&#xff08;国际品牌&传播设计奖&#xff09;共收到来自40多个国家或地区的有效参赛作品共1723件。 经过激烈的竞争&#xff0c;我们莱佛士设计学院的三位同学成功入围提名&#xff08;学生组&#xff09;&#xff0c;他们分别是来自多媒体设计专…

寻求发展+兼顾陪读|企业高管赴美国乔治梅森大学做访问学者

E经理拟去美国访学&#xff0c;想达到3个目的&#xff1a;结合本专业方向&#xff0c;扩展至跨学科研究领域&#xff1b;考察市场&#xff0c;寻求新的发展契机&#xff1b;携孩子出国读书&#xff0c;兼顾陪读&#xff0c;并希望尽早出国。最终我们为其落实的乔治梅森大学访问…

蓝桥杯成绩已出

蓝桥杯的成绩早就已经出来了&#xff0c;虽然没有十分惊艳 &#xff0c;但是对于最终的结果我是心满意足的&#xff0c;感谢各位的陪伴&#xff0c;关于蓝桥杯的刷题笔记我已经坚持更新了49篇&#xff0c;但是现在即将会告别一段落&#xff0c;人生即将进入下一个规划。我们一起…

【新手入门】Github与Git使用教程

Github与Git 一、Github基础教程 1.1 基本操作 点击代码文件可以直接查看文件的内容&#xff0c;支持在线修改文件&#xff0c;只需要点击(文件内容)右上角的编辑按钮即可进行编辑。 README.md一般介绍项目的功能&#xff0c;用法&#xff0c;注意事项&#xff1b;有时还有…

银行ETL-监管报送

1104报表 1104报表主要包括&#xff1a;资产负债&#xff0c;表外业务、流动性风险、贷款质量、投向行业和地区、重点客户等。 1104报表分类 普通报表、特色类报表。 反洗钱 大额交易、可疑交易。标签分类&#xff1a;疑似犯罪、疑似毒品、疑似传销。 反洗钱—接口报表 数…

MySQL基础指南:从入门到精通

MySQL基础指南&#xff1a;从入门到精通 MySQL是一个流行的开源关系型数据库管理系统&#xff0c;被广泛用于Web应用程序和服务器端开发。本文将从MySQL的基本概念开始&#xff0c;逐步介绍MySQL的安装、常用操作、数据类型、查询语句等内容&#xff0c;帮助你快速入门MySQL数…

物联网设计竞赛_5_Jetson Nano连接摄像头解决运行卡顿问题

我在命令行用camorama命令打开摄像头的时候发现摄像头非常流畅 当我用python的cv2库打开摄像头的时候发现摄像头显示图片异常卡顿&#xff0c;在网上多方寻觅无果后&#xff0c;经过偶然尝试&#xff0c;我发现了卡顿原来是视频帧率问题 淘宝官方资料看我的摄像头只有30fps, …

##21 深入理解文本处理:使用PyTorch进行NLP基础操作

文章目录 前言简介文本预处理实现分词构建词汇表 文本向量化构建简单的文本分类模型结论 前言 在现代深度学习应用中&#xff0c;文本处理是不可或缺的一部分&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;领域。借助强大的框架如PyTorch&#xff0c;我们可以更加…