【Leedcode】栈和队列必备的面试题(第四期)

news2025/1/7 5:14:10

【Leedcode】栈和队列必备的面试题(第四期)


文章目录

  • 【Leedcode】栈和队列必备的面试题(第四期)
  • 一、题目
  • 二、思路+图解
    • 1.声明结构体
    • 2.循环链表开辟动态结构体空间
    • 3.向循环队列插入一个元素
    • 4.循环队列中删除一个元素
    • 5. 从队首获取元素
    • 6. 获取队尾元素
    • 7.检查循环队列是否为空
    • 8.检查循环队列是否已满
    • 9.释放循环链表
  • 三、可能遇到的问题
  • 四、整体源代码
  • 总结


一、题目

Leedcode链接


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

这几个接口使我们需要实现的我会一 一实现并讲解!


二、思路+图解

1.声明结构体

在这里插入图片描述

代码如下(示例):

typedef struct {
    int *a;
    int front;
    int tail;
    int k;
} MyCircularQueue;

2.循环链表开辟动态结构体空间

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


代码如下(示例):

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* cp = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    cp->a = (int*)malloc(sizeof(int)*(k+1));
    cp->front = cp->tail = 0;
    cp->k = k;
    return cp;
}

3.向循环队列插入一个元素

在这里插入图片描述


在这里插入图片描述


代码如下(示例):

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
    {
        return false;
    }
    obj->a[obj->tail] = value;
    obj->tail++;
    obj->tail %= (obj->k+1);
    return true;
}

4.循环队列中删除一个元素

直接++obj->front即可,要注意:front走的是循环链表,可以:obj->front %= (obj->k+1);
在这里插入图片描述


在这里插入图片描述


代码如下(示例):

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return false;
    }

    obj->front++;
    obj->front %= (obj->k+1);
    return true;
}

5. 从队首获取元素

直接返回 obj->a[obj->front],别忘了题目要求找不到返回 -1

代码如下(示例):

int myCircularQueueFront(MyCircularQueue* obj) {
    //取首元素数据
     if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    return obj->a[obj->front];
}

6. 获取队尾元素

在这里插入图片描述


![在这里插入图片描述](https://img-blog.csdnimg.cn/2ae4e685ecae47c3aacbd8cbc565b768.pn


![在这里插入图片描述](https://img-blog.csdnimg.cn/0822c4a4cf264bd08c279c80f2b705fd.png


代码如下(示例):

int myCircularQueueRear(MyCircularQueue* obj) {
     if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    if(obj->tail == 0)
    {
        return obj->a[obj->k];
    }
    else
    {
        return obj->a[obj->tail-1];
    }
}

7.检查循环队列是否为空

剩下的几个接口相对来说很简单,直接上代码!

代码如下(示例):

bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{
    return obj->front == obj->tail;
}

8.检查循环队列是否已满

不论是判空还是判满,都要开 k+1 个空间,这是这道题的精髓!!!


在这里插入图片描述

代码如下(示例):

bool myCircularQueueIsFull(MyCircularQueue* obj) 
{
    return (obj->tail+1)%(obj->k+1) == obj->front;
}

9.释放循环链表

两次依次释放空间即可

代码如下(示例):

void myCircularQueueFree(MyCircularQueue* obj) 
{
    free(obj->a);
    free(obj);
}

三、可能遇到的问题

此时我们提交代码,会出现以下问题!
在这里插入图片描述


这里表明我们在接口中定义的两个函数 myCircularQueueIsEmptymyCircularQueueIsFull 需要声明一下!
在这里插入图片描述


四、整体源代码

代码如下(示例):

//声明结构体
typedef struct {
    int *a;
    int front;
    int tail;
    int k;
} MyCircularQueue;

bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);

MyCircularQueue* myCircularQueueCreate(int k) {
    //开辟动态结构体空间,用指针p维护
    MyCircularQueue* cp = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //一次性动态开辟好数组
    cp->a = (int*)malloc(sizeof(int)*(k+1));
    //初始化值
    cp->front = cp->tail = 0;
    cp->k = k;
    //函数要求返回指针  指针的类型是MyCircularQueue
    return cp;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //如果数组是满的返回 false
    if(myCircularQueueIsFull(obj))//注意在这里调用了下面的自定义函数 所以要在前面提前声明函数
    {
        return false;
    }
    //如果数组没满来到这里 进行导入输入 并修改tail的值 
    obj->a[obj->tail] = value;
    obj->tail++;
    obj->tail %= (obj->k+1);
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))//注意在这里调用了下面的自定义函数 所以要在前面提前声明函数
    {
        return false;
    }

    obj->front++;
    obj->front %= (obj->k+1);
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    //取首元素数据
     if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    return obj->a[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    //取尾元素数据
     if(myCircularQueueIsEmpty(obj))
    {
        //当数组为空 则返回-1
        return -1;
    }
    //数组不为空来到这 tail指向的地址的值肯定是空的 所以需要找tail后面的一个元素(tail-1)
    //但是由于是环形数组当tail是0下标的时候 0-1 = -1  可实际情况我们是要找数组的最后一个下标 数组最后一个下标不可能是-1
    //那么特殊情况 特殊对待做if else判断
    if(obj->tail == 0)
    {
        return obj->a[obj->k];
    }
    else
    {
        return obj->a[obj->tail-1];
    }
    //其实下面还有一种运算方法  套用tail=0 我们可以发现 i就等于了数组最后一个元素的下标k 
    //因为数组实质开辟空间是开辟的k+1个元素 那么k就是数组的尾元素下标
    //int i = (obj->tail+obj->k)%(obj->k+1);
    //return obj->a[i];
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    //判断数组是否为空
    return obj->front == obj->tail;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    //判断数组是否为满
    return (obj->tail+1)%(obj->k+1) == obj->front;
}

void myCircularQueueFree(MyCircularQueue* obj) {
    //依次释放空间
    free(obj->a);
    free(obj);
}

/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 
 * bool param_2 = myCircularQueueDeQueue(obj);
 
 * int param_3 = myCircularQueueFront(obj);
 
 * int param_4 = myCircularQueueRear(obj);
 
 * bool param_5 = myCircularQueueIsEmpty(obj);
 
 * bool param_6 = myCircularQueueIsFull(obj);
 
 * myCircularQueueFree(obj);
*/


在这里插入图片描述


总结

以上就是今天要讲的内容,本文介绍了【Leedcode】中栈和队列必备的面试题(第四期)
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

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

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

相关文章

STM32C0介绍(1)----概述

概述 STM32C0系列微控制器是意法半导体公司推出的一款低功耗、高性能的微控制器产品。它们被设计用于需要小型、低功耗和高度可集成的应用程序,如传感器、消费品、电池供电设备、家庭自动化和安全等应用。该系列的微控制器采用ARM Cortex-M0内核,具有丰…

软件测试之缺陷

缺陷 1. 软件缺陷的概述 1.1 软件缺陷定义 软件缺陷, 通常又被叫做bug或者defect, 即为软件或程序中存在的某种破坏正常运行能力的问题、错误,其存在会导致软件产品在某种程度上不能满足用户的需求. 软件缺陷是指存在于软件(程序、数据、文档中的)那些不符合用户需求的问题.…

Ubuntu 交叉编译工具链安装

Ubuntu 交叉编译工具链安装 1 交叉编译器安装 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,我们在第三章“Linux C 编程入门”里面已经讲解了如何在 Liux 进行 C 语言开发,里面使用 GCC 编译器进行代…

如何使用bomber扫描软件物料清单(SBOM)以查找安全漏洞

关于bomber bomber是一款针对软件物料清单(SBOM)的安全漏洞扫描工具,广大研究人员可以通过该工具扫描和检测软件物料清单(SBOM)。 当你向一家供应商索要了他们的一个封闭源代码产品的软件材料清单,而他们…

Spring6全面详解

Spring6全面详解 自2022年11月,Spring6正式发布。在Spring6中,对于JDK的要求最低为 17。(17 - 19) 部分文本摘抄于尚硅谷视频(bilibili)做了一定的排版和个人的理解。如果不是很熟悉,可以去看 …

ABAP 辨析 标准表|排序表|哈希表

1、文档介绍 本文档将介绍内表的区别和用法,涉及标准表、排序表、哈希表 2、用法与区别 2.1、内表种类 内表顶层为任意表,任意表分为索引表和哈希表,索引表又可分为标准表和排序表,结构如图: 2.2、内表用法 2.2.1…

GeoTools 存在 sql 注入漏洞

漏洞描述 GeoTools 是一个用于处理地理空间数据(如地理信息系统: GIS)的开源代码库,并且支持 OGC 过滤器表达式语言的解析和编码。PostGIS是PostgreSQL数据库的扩展程序,增加了数据库对地理对象的支持。PostGIS DataStore 为GeoT…

Android Framework-操作系统基础

最近在看《深入理解Android内核设计思想(第2版)》,个人感觉很不错,内容很多,现将书里个人认为比较重要的内容摘录一下,方便后期随时翻看。 计算机体系结构 硬件是软件的基石,所有的软件功能最…

【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…

不用PS,也能实现抠图的工具

对于非设计专业的同学来说,专门下载 PS 抠图有点大材小用,而且运用 PS 对电脑配置一定要求。不过现在有了更多选择,市面上出现了越来越多的抠图软件,不过越多的抠图软件选择也意味着需要花费时间试错因此本文将给大家推荐 3 款非常…

递归算法(recursion algorithm)

递归算法 什么是递归算法 在过程或者函数里调用自身的算法; 递归算法(recursion algorithm),通过重复将问题分解为同类的子问题而解决问题的方法, Java中函数可以通过调用自身来进行递归,大多数编程语句…

jQuery 属性操作

jQuery 属性操作 Date: February 28, 2023 Sum: jQuery属性操作、文本属性值、元素操作、尺寸、位置操作 jQuery 属性操作 设置或获取元素固有属性值 prop() 所谓元素固有属性就是元素本身自带的属性,比如 元素里面的 href ,比如 元素里面的 type。 …

以太网调试经验总结

1.MDC时钟捕获 在bringup时,首先需要确认MDC/MDIO控制通道是否正常,通过捕获MDC时钟以确认MDC/MDIO的工作状态是否正常,MDC时钟频率由具体的PHY芯片决定,不同的PHY芯片支持的MDC时钟频率范围不通。 注意1:MDC时钟频率不…

【3.1】MySQL锁、动态规划、Redis缓存,过期删除与淘汰策略

5.4 MySQL死锁了,怎么办? RR隔离级别下,会存在幻读的问题,InnoDB为了解决RR隔离级别下的幻读问题,就引出了next-key 锁,是记录锁和间隙锁的组合。 Record Lock,记录锁,锁的是记录本身…

常用的“小脚本“-json数据处理

小背景: 我们公司项目中的小脚本是一些工具类,比如常用的是MapUtil工具类的一些方法 写公司的MapUtil工具类的方法要注意,方法名的命名,因为方法名,在公司的项目的某个业务流程有对方法名的进行String截取开头字符串然…

考研机试 | C++ | 王道复试班 | map专场

目录关于map查找学生信息(清华上机)题目代码:魔咒词典(浙大机试)题目:代码英语复试常用话题关于map map的一些基本操作: 判空 :map.empty()键值对的个数: map.size()插入…

进程、线程、协程详解

目录 前言: 一、进程 进程的概念 进程内存空间 二、线程 线程的定义 内核线程 用户线程 内核线程和用户线程的比较 线程的状态 三、协程 协程的定义 协程序相对于线程优势 运用场景 四、线程、协程、进程切换比较 前言: 有时候无法…

JPA之实体之间的关系

JPA之实体之间的关系 10.1.1实体类创建 注解的应用 Table,Entity IdGeneratedValue指定主键,Column P174 实体类编写规范 Table(name "t_user") Entity(name "User") public class User implements Serializable {IdGeneratedVa…

王道操作系统课代表 - 考研计算机 第二章 进程与线程 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “进程与线程” 章节知识点总结的十分全面,涵括了《操作系统》课程里的全…

机器学习——线性学习

提及线性学习,我们首先会想到线性回归。回归跟分类的区别在于要预测的目标函数是连续值线性回归假定输入空间到输出空间的函数映射成线性关系,但现实应用中,很多问题都是非线性的。为拓展其应用场景,我们可以将线性回归的预测值做…