当前位置: 首页 > news >正文

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

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


文章目录

  • 【Leedcode】栈和队列必备的面试题(第二期)
  • 一、题目(用两个队列实现栈)
  • 二、思路+图解
    • 1.定义两个队列
    • 2.初始化两个队列
    • 3.往两个队列中放入数据
    • 4.两个队列出数据
    • 5.显示栈顶信息
    • 6.判断栈或者队列是否为空
    • 7.销毁栈或者队列
  • 三、总代码展示
  • 总结


一、题目(用两个队列实现栈)

Leedcode链接


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
这几个接口使我们需要实现的我会一 一实现并讲解!


二、思路+图解

注意:这里会用到很多栈和队列接口实现的一些知识,这里不再深究,如果想了解可以去下面两个博客!
栈的接口模拟实现 + 队列的接口模拟实现


做本题需要的接口和结构体声明!

代码如下(示例):

typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QueueNode;typedef struct Queue
{QueueNode* head;QueueNode* tail;
}Queue;void QueueInit(Queue* pq);//初始化队列
void QueueDestroy(Queue* pq);//销毁队列
void QueuePush(Queue* pq, QDataType x);//放入数据
void QueuePop(Queue* pq);//删除数据
QDataType QueueFront(Queue* pq);//取头数据
QDataType QueueBack(Queue* pq);//取尾数据
size_t QueueSize(Queue* pq);//计算数据个数
bool QueueEmpty(Queue* pq);//判断队列是不是空void QueueInit(Queue* pq)
{assert(pq);pq->head = NULL;pq->tail = NULL;
}void QueueDestroy(Queue* pq)//销毁队列
{assert(pq);//创建一个cur指针 指向队列头 用于挨个释放空间QueueNode* cur = pq->head;//当cur不为NULL 一直循环执行  挨个释放列表成员空间while (cur != NULL){QueueNode* next = cur->next;free(cur);cur = next;}//当循环结束 将 head与tail 置为NULLpq->head = pq->tail = NULL;
}void QueuePush(Queue* pq, QDataType x)//放入数据
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));newnode->data = x;newnode->next = NULL; if (pq->head == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}}void QueuePop(Queue* pq)//删除数据
{assert(pq);assert(!QueueEmpty(pq));QueueNode* next = pq->head->next;free(pq->head);if (pq->head == pq->tail){pq->tail = NULL;}pq->head = next; 
}QDataType QueueFront(Queue* pq)//取头数据
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}QDataType QueueBack(Queue* pq)//取尾数据
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}
size_t QueueSize(Queue* pq)//计算数据个数
{assert(pq);assert(!QueueEmpty(pq));QueueNode* cur = pq->head;int n = 0;while (cur){cur = cur->next;n++;}return n;
}bool QueueEmpty(Queue* pq)//判断队列是不是空
{assert(pq);return pq->head == NULL && pq->tail == NULL;
}

1.定义两个队列

代码如下(示例):

typedef struct{Queue q1;Queue q2;
} MyStack;

2.初始化两个队列

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

代码如下(示例):

MyStack* myStackCreate() {MyStack* st = (MyStack*)malloc(sizeof(MyStack));QueueInit(&st->q1);QueueInit(&st->q2);return st;
}

3.往两个队列中放入数据


在这里插入图片描述


在这里插入图片描述


代码如下(示例):

void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else{QueuePush(&obj->q2, x);}
}

4.两个队列出数据

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


代码如下(示例):

int myStackPop(MyStack* obj) {Queue* emptyQ = &obj->q1;Queue* nonemptyQ = &obj->q2;if(!QueueEmpty(&obj->q1)){nonemptyQ = &obj->q1;emptyQ = &obj->q2;}while(QueueSize(nonemptyQ)>1){QueuePush(emptyQ, QueueFront(nonemptyQ));QueuePop(nonemptyQ);}int ret = QueueFront(nonemptyQ);QueuePop(nonemptyQ);return ret;
}

5.显示栈顶信息

在这里插入图片描述

代码如下(示例):

int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}

6.判断栈或者队列是否为空

在这里插入图片描述

代码如下(示例):

bool myStackEmpty(MyStack* obj) 
{return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

7.销毁栈或者队列

在这里插入图片描述


在这里插入图片描述

代码如下(示例):

void myStackFree(MyStack* obj) 
{QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

三、总代码展示

代码如下(示例):

typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QueueNode;typedef struct Queue
{QueueNode* head;QueueNode* tail;
}Queue;void QueueInit(Queue* pq);//初始化队列
void QueueDestroy(Queue* pq);//销毁队列
void QueuePush(Queue* pq, QDataType x);//放入数据
void QueuePop(Queue* pq);//删除数据
QDataType QueueFront(Queue* pq);//取头数据
QDataType QueueBack(Queue* pq);//取尾数据
size_t QueueSize(Queue* pq);//计算数据个数
bool QueueEmpty(Queue* pq);//判断队列是不是空void QueueInit(Queue* pq)
{assert(pq);pq->head = NULL;pq->tail = NULL;
}void QueueDestroy(Queue* pq)//销毁队列
{assert(pq);//创建一个cur指针 指向队列头 用于挨个释放空间QueueNode* cur = pq->head;//当cur不为NULL 一直循环执行  挨个释放列表成员空间while (cur != NULL){QueueNode* next = cur->next;free(cur);cur = next;}//当循环结束 将 head与tail 置为NULLpq->head = pq->tail = NULL;
}void QueuePush(Queue* pq, QDataType x)//放入数据
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));newnode->data = x;newnode->next = NULL; if (pq->head == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}}void QueuePop(Queue* pq)//删除数据
{assert(pq);assert(!QueueEmpty(pq));QueueNode* next = pq->head->next;free(pq->head);if (pq->head == pq->tail){pq->tail = NULL;}pq->head = next; 
}QDataType QueueFront(Queue* pq)//取头数据
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}QDataType QueueBack(Queue* pq)//取尾数据
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}
size_t QueueSize(Queue* pq)//计算数据个数
{assert(pq);assert(!QueueEmpty(pq));QueueNode* cur = pq->head;int n = 0;while (cur){cur = cur->next;n++;}return n;
}bool QueueEmpty(Queue* pq)//判断队列是不是空
{assert(pq);return pq->head == NULL && pq->tail == NULL;
}//定义两个队列
typedef struct{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {//函数内定义变量出了函数就没了,所以我们在这里选择用malloc开辟动态空间 并将这个空间的地址返回给函数MyStack* st = (MyStack*)malloc(sizeof(MyStack));//调用自己的队列初始化函数 将定义的2个队列初始化QueueInit(&st->q1);QueueInit(&st->q2);//函数要求 返回新开辟的地址(栈地址)return st;
}void myStackPush(MyStack* obj, int x) {//往栈中放入数据if(!QueueEmpty(&obj->q1))//当q1不是空的时 将数据放入q1队列中{//调用队列函数,自定义函数传过来的是栈的指针,所以要&obj的地址指向q1QueuePush(&obj->q1, x);}else//当q2不是空的时 将数据放入q1队列中  由于这里是else 所以假设q1 q2都是空也会将数据放入q2队列中{QueuePush(&obj->q2, x);}
}int myStackPop(MyStack* obj) {//emptyQ表示空队列   nonEmptuQ 表示有元素队列//先假设定义队列 q1为空 q2 非空Queue* emptyQ = &obj->q1;Queue* nonemptyQ = &obj->q2;//然后调用判断是否为空函数if(!QueueEmpty(&obj->q1))//如果队列q1 非空进入循环{//向q1道歉 将q1改为非空  将q2改为空nonemptyQ = &obj->q1;emptyQ = &obj->q2;}//此时 nonempyuQ 与 emptyQ 经历了修正 队列nonempyuQ 是非空 emptyQ是空 (特殊情况下两者都是空)while(QueueSize(nonemptyQ)>1)//循环条件 非空的nonemptyQ队列数据个数最少是大于1就可以进入循环,假设等于或小于1不进入循环{//将非空nonemptyQ队列元素数据放入,空emptyQ队列中QueuePush(emptyQ, QueueFront(nonemptyQ));//放进去一个就删除一个非空nonemptyQ队列元素QueuePop(nonemptyQ);}//当循环结束来到这里nonempty内只有一个元素,这个元素也表示的是栈顶的元素(特殊情况下nonempty也是空的)int ret = QueueFront(nonemptyQ);QueuePop(nonemptyQ);//最后删除这个元素(表达出栈行为)return ret;//函数要求返回这个被删除的元素数据
}
int myStackTop(MyStack* obj) {//显示栈顶信息if(!QueueEmpty(&obj->q1))//栈顶不为空进入{//返回q1队列尾部数据return QueueBack(&obj->q1);}else{//返回q2队列尾部数据return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {//当q1为空 并且 q2为空 则返回真 return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {//先将q1 和 q2 空间销毁QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);//最后释放obj空间free(obj);
}/*** Your MyStack struct will be instantiated and called as such:* MyStack* obj = myStackCreate();* myStackPush(obj, x);* int param_2 = myStackPop(obj);* int param_3 = myStackTop(obj);* bool param_4 = myStackEmpty(obj);* myStackFree(obj);
*/

总结

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

相关文章:

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

【Leedcode】栈和队列必备的面试题(第二期) 文章目录【Leedcode】栈和队列必备的面试题(第二期)一、题目(用两个队列实现栈)二、思路图解1.定义两个队列2.初始化两个队列3.往两个队列中放入数据4.两个队列出…...

Elasticsearch实战之(商品搜索API实现)

Elasticsearch实战之(商品搜索API实现) 1、案例介绍 某医药电商H5商城基于Elasticsearch实现商品搜索 2、案例分析 2.1、数据来源 商品库 - 平台运营维护商品库 - 供应商维护 2.2、数据同步 2.2.1、同步双写 写入 MySQL,直接也同步往…...

剑指 Offer 14-剪绳子

摘要 ​​​​​​剑指 Offer 14- I. 剪绳子 剑指 Offer 14- II. 剪绳子 II 343. 整数拆分 一、动态规划解析 这道题给定一个大于1的正整数n,要求将n 拆分成至少两个正整数的和,并使这些正整数的乘积最大化,返回最大乘积。令x是拆分出的第…...

泰克示波器|MSO64示波器的应用

泰克新一代示波器MSO64为实例来讲解时频域信号分析技术。MSO64采用全新TEK049平台,不仅实现了4通道同时打开时25GS/s的高采样率,而且实现了12-bit高垂直分辨率。同时,由于采用了新型低噪声前端放大ASIC—TEK061,大大降低了噪声水平…...

1.4 黑群晖安装:SataPortMap和DiskIdxMap两种获取方式

tinycore及安装工具下载:工具:链接:https://pan.baidu.com/s/1CMLl6waOuW-Ys2gKZx7Jgg?pwdchct提取码:chcttinycore:链接:https://pan.baidu.com/s/19lchzLj-WDXPQu2cEcskBg?pwddcw2 提取码:d…...

JVM虚拟机概述(2)

3.JVM 运行时数据区 3.1.1 程序计数器(Program Counter Register) 是一块很小的内存空间,用来记录每个线程运行的指令位置,是线程私有的,每个线程都拥有一个程序计数器,生命周期与线程一致,是运行时数据区中唯一一个不…...

Intel CSME 简述

SME 算是 Intel X86 PC 上最神秘的部分了,本文根据 us-19-Hasarfaty-Behind-The-Scenes-Of-Intel-Security-And-Manageability-Engine 一文写成。讲述内容无法证伪,各位随便听听即可,了解这些能够帮助BIOS 工程师更好的理解一些操作的实现。文章基于 Intel 第八代第九代CPU(…...

复位理论基础

先收集资料,了解当前常用的基础理论和实现方式 复位 初始化微控制器内部电路 将所有寄存器恢复成默认值确认MCU的工作模式禁止全局中断关闭外设将IO设置为高阻输入状态等待时钟趋于稳定从固定地址取得复位向量并开始执行 造成复位的原因 有多种引起复位的因素&…...

Python基础知识——列表

列表 列表是可以存放任何数据,包括整型,浮点型,字符串,布尔型等等,是常用的数据类型之一。 1.列表的创建 列表也是一个可迭代对象 1. 普通形式l [1,2,3,4,5] ---整型列表l ["a","b","c&…...

如何使用工时表管理项目和非项目的资源?

对新机会做出反应的能力是企业竞争优势的关键。项目不断涌现,企业需要了解具体的可用性以及是否有资源来接受新事物。更进一步来说,企业需要知道员工将时间花在哪里。 使用 8Manage工时表解决方案,你将始终拥有做出正确业务决策所需的全面知…...

项目经理如何做好质量保证与标准维持?非技术项目经理如何做好质量管控?

项目经理如何做好质量保证与标准维持?非技术项目经理如何做好质量管控?01.质量保障需要重视哪些执行层面的细节02.非技术出身项目经理如何做好质量保障工作03.质量管理除了PDCA,还有哪些推荐的方法04.质量保证与标准维持,作为常态…...

[文件操作] File 类的用法和 InputStream, OutputStream 的用法

能吃是不是件幸福的事呢 文章目录前言1. 文件的相关定义2. 文件类型3. Java对文件系统的操作3.1 对文件的基础操作3.2 读文件3.3 写文件前言 从这章开始,我们就开始学文件操作相关的知识了~ 1. 文件的相关定义 1.文件的定义可以从狭义和广义两个方面解释. 狭义: 指硬盘上的文…...

索莫菲模型的一些理解 Smomerfeld Model

如何解释传统热容算出来的数值与量子模型下的区别? 因为只有费米能附近的电子才能够进行移动,这个是问题的差别所在 我们下面就来介绍如何求费米能(费米能的计算) 既然费米能附近的电子很重要,那么附近的电子有多少很…...

SAP ERP系统MM模块常用增强之四:采购申请输入字段的校验检查

在SAP/ERP项目的实施中采购管理模块(MM)的创建和修改采购申请一般都会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,这方面需求部分是可以通过配置实现,比如一些字段是否必输,是否显示等&…...

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

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

windows无盘启动技术开发之传统BIOS(Legacy BIOS)引导程序开发之一

by fanxiushu 2023-03-01 转载或引用请注明原始作者。这个话题可能有点老,UEFI BIOS 已经大量存在,而Legacy BIOS最终会被取代。但是也是作为无盘启动技术里不可或缺的,毕竟还有许多老型号的电脑存在,而且为了兼容性,有…...

mysql实现if语句判断功能的六种使用形式

文章目录 前言一、ifnull函数二、nullif函数三、if函数四、if语句(多用于存储过程)五、if-else语句(多用于存储过程)六、if-elseif-else语句(多用于存储过程)总结前言 在Mysql数据库中实现判断功能有很多方式,具体又分为函数和if语句形式,函数的好处是可以作为sql的一…...

在Vue3这样子写页面更快更高效

前言 在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。 对于刚开始只有 1&#xff…...

做软件测试,如何才能实现月入20K?

听我的,测试想要月入20k。 首先你要去大厂,不在大厂起码也得在一线城市,北上广深。 二线城市的话成都、杭州最好。 不然的话想都不要想。 像我之前整理过成都的公司,除了字节跳动、蚂蚁金服、滴滴、美团、京东、平安、字节跳动…...

mysql last lesson

1:创建用户 create user zhang identified by 12345678;2:给用户授权,撤销授权, grant.......to revoke ....... 3:将数据库中的数据导出 C:\Windows\system32>mysqldump bjpowernode>C:\bjpowernode.sql -uroot -p12345678 4&#…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...