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

【LeetCode】数据结构题解(12)[用栈实现队列]

用栈实现队列

  • 😉 1.题目来源
  • 👀2.题目描述
  • 🤔3.解题思路
  • 🥳4.代码展示

在这里插入图片描述

所属专栏:玩转数据结构题型❤️
🚀 >博主首页:初阳785❤️
🚀 >代码托管:chuyang785❤️
🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
🚀 >博主也会更加的努力,创作出更优质的博文!!❤️
🚀 >关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️
😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘

😉 1.题目来源

LeetCode用栈实现队列
🚨注意:本题涉及到有关数据结构——队列和栈,这两章节的知识点,如有小伙伴还不熟栈的,可以先复习复习一下有关栈的相关知识,复习的地方我也提供了哦🙂,所用到的知识点——栈,所用到的知识点——队列
🚨注意:同样的本题是使用纯C语言实现的.

👀2.题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
1.void push(int x) 将元素 x 推到队列的末尾
2.int pop() 从队列的开头移除并返回元素
3.int peek() 返回队列开头的元素
4.boolean empty() 如果队列为空,返回 true ;否则,返回 false

🤨说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

在这里插入图片描述

🤔3.解题思路

  • 从题目要求我们知道,要用两个栈列实现队列的功能,也就是使用的是栈,😎但是实现的效果时队列的效果。
  • 开始做题之前我们首要的是明白队列和栈的特点。这里我们就简单的提一下,具体的知识请看上述给的链接。💯队列——队列的特性是👍先进的先出,就跟食堂打饭一样,先到的先打饭,打完饭就可以走了。栈——栈的特性是👍先进的后出,就跟我们在桌子上叠书一样,想要拿到最底下的书就要先把最上面的书先拿走。
  • 首先队列的插入和栈的插入都是一样的,都是尾插,所以push这个动作并不难,关键是栈的删除是尾删,而队列的删除时头删,那怎么样才能使用两个栈实现删除头上的数据呢。既然栈是尾删,能不能把存放进去的数据反过来,这样虽然栈进行的是尾删,但是删除的是头上的数据,也就相当于是头删一样了。
  • 👉那么我们的思路肯定是这样的:两个栈,首先第一次存放数据的时候,😎随便找一个栈粗放数据,假设放的是1,2,3,4,5头数据是1,尾数据是5,等到要删除的时候通过找到尾的方式把数据一一放到另一个栈中,这样另一个栈的数据就是5,4,3,2,1了,这个时候头数据就是5,尾数据就是1了,Pop的时候就是Pop尾数据1,也就是插入时的头数据,这样就实现头删😉。而如果还要继续存放数据的时候就把数据按照上面同样的操作把数据重新放回去,也就是2,3,4,5,然后继续在后面放数据,要删除的时候再重复第一次的操作即可。那么问题来了,从上述分析我们知道了两个栈,一个栈是用来存放数据进去的栈我们命名为Spush,一个是用来删除数据的栈Spop,而且我们每次还要继续放数据的是由都要把数据从Spop中把数据放回Spush,然后进行追加数据🤦‍,但是这一步真的有必要吗?🤔其实并不需要这两个栈就只需要完成一个push另一个pop就行了,追加数据的时候也不需要把数据从Spop中重新放回Spush中,只需要等Spop中数据被删除完后,再从Spush中导入即可。

在这里插入图片描述
在这里插入图片描述

  • 所以总上所述,我们的两个栈,每一栈复杂特定的功能,一个负责push数据,一个用来pop数据

  • 🙂同时解释一下我们oj刷题的时出现的一些一些疑问


typedef struct {} MyQueue;MyQueue* myQueueCreate() {}

这个是我们题目出现的函数接口,我来解释一下表示什么意思。

  1. 题目已经明确我们要使用两个栈来实现队列,所有我们就得创建两个栈的,而我们通常遇到这种两个及以上的要使用的成员时,👍为了减少传递的参数,以及代码的可读性简洁性,😮我们通常会用一个结构体把他们封装起来,所以我们的上述结构体就是用来创建两个栈的,并且这个结构体还是个匿名结构体,匿名结构体的特点就是只能用一次,这里我们只需要使用一次即可,所以匿名合理。
  2. 而另一个函数接口是用来初始化我们的结构体的,并返回结构体指针。🎇

🥳4.代码展示

//栈函数接口
typedef int STDataType;
typedef struct Stack
{STDataType* data;int capaciyt;int size;
}Stack;void StackInit(Stack* ps);void StackDestroy(Stack* ps);void StackPush(Stack* ps, STDataType x);void StackPop(Stack* ps);STDataType StackTop(Stack* ps);bool StackEmpt(Stack* ps);int StackSize(Stack* ps);void StackInit(Stack* ps)
{assert(ps);ps->data = NULL;ps->capaciyt = 0;ps->size = 0;
}void StackDestroy(Stack* ps)
{assert(ps);free(ps->data);ps->data = NULL;ps->capaciyt = ps->size = 0;
}void StackPush(Stack* ps, STDataType x)
{assert(ps);if (ps->size == ps->capaciyt){int newCapacity = ps->capaciyt == 0 ? 4 : ps->capaciyt * 2;STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror("realloc");exit(-1);}ps->data = tmp;ps->capaciyt = newCapacity;}ps->data[ps->size] = x;ps->size++;
}void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpt(ps));ps->size--;
}STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpt(ps));return ps->data[ps->size - 1];
}bool StackEmpt(Stack* ps)
{assert(ps);return ps->size == 0;
}int StackSize(Stack* ps)
{assert(ps);return ps->size;
}//函数实现
typedef struct {Stack Spush;Stack Spop;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* ret = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&ret->Spush);StackInit(&ret->Spop);return ret;
}//这里我把Peek函数放到了前面,考虑到后面的Pop也会用到类似的功能,直接服用Peek就行了
int myQueuePeek(MyQueue* obj) {//为空导入数据if (StackEmpt(&obj->Spop)){while (!StackEmpt(&obj->Spush)){StackPush(&obj->Spop,StackTop(&obj->Spush));StackPop(&obj->Spush);}}return StackTop(&obj->Spop);
}void myQueuePush(MyQueue* obj, int x) {//直接再Spush中插入数据StackPush(&obj->Spush,x);
}int myQueuePop(MyQueue* obj) {//服用Peek,如果Spop为空,就从Spush中导入数据int ret = myQueuePeek(obj);StackPop(&obj->Spop);return ret;
}bool myQueueEmpty(MyQueue* obj) {//两个为空才为空return StackEmpt(&obj->Spop) && StackEmpt(&obj->Spush);
}void myQueueFree(MyQueue* obj) {StackDestroy(&obj->Spop);StackDestroy(&obj->Spush);free(obj);
}

相关文章:

【LeetCode】数据结构题解(12)[用栈实现队列]

用栈实现队列 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 所属专栏:玩转数据结构题型❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ &…...

嵌入式Linux下LVGL的移植与配置

一.sdk源码下载路径 1.官方源码下载路径如下: ​​​​​​ https://github.com/lvgl/lvgl git下载方式 git clone https://github.com/lvgl/lvgl.git 2.个人移植好的源码8.2版本下载路径: 链接:https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwdc68e 提取…...

leetcode每日一练-第70题-爬楼梯

一、思路 动态规划 二、解题方法 使用一个动态规划数组 dp 来记录到达每个台阶的不同方法数。初始情况下,当台阶数为 1 时,方法数为 1,当台阶数为 2 时,方法数为 2。然后,我们从第 3 阶开始逐步计算每一阶的方法数&…...

设备使用RTMP推流到安防监控EasyCVR视频汇聚平台,为何只有FLV格式无法播放?

TSINGSEE青犀视频安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等功能。 智能视频监控平台EasyCVR可…...

arcgis宗地或者地块四至权利人信息提取教程

ARCGIS怎样将图斑四邻的名称及方位加入其属性表 以前曾发表过一篇《 如何把相邻图斑的属性添加在某个字段中》的个人心得,有些会员提出了进一步的要求,不但要相邻图斑的名称,还要求有方位,下面讲一下自己的做法。 基本思路是:连接相邻图斑质心,根据连线的角度确定相邻图斑…...

乐鑫首创|使用 ESP RainMaker® 私有云定制 Matter 生态

ESP RainMaker 是乐鑫的 AIoT 云平台,支持客户自主部署私有物联网云,从而全面掌握数据所有权和管理权,实现定制功能与服务。ESP RainMaker 云后端采用 AWS 无服务器架构,拥有开源的 iOS 和 Android 移动端 APP、第三方语音助手集成…...

【算法|数组】快慢指针

算法|数组——快慢指针 引入 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你…...

C++字符串:使用 std::string

C字符串&#xff1a;使用 std::string 初始化方法一 std::string 变量名称 { “字符串”}&#xff1b; std::string str { " 这是一个字符串" }&#xff1b;std::cout << str; std::cin >> str;初始化方法二 std::string 变量名称 { “字符串”&#x…...

目前Java后端就业前景怎么样?

前言 并不乐观&#xff0c;看看现在的就业形式就知道了&#xff0c;基本上是僧多粥少的情况&#xff0c;你可能会看到很多编程语言排行榜或者流行榜中Java的排名很高&#xff0c;如同下面这种&#xff1a; 看排名确实可以粗略的得知语言当下的流行度、使用率&#xff0c;但是它…...

C语言基础(持续更新)

常用函数 strrchr 描述 C 库函数 char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c&#xff08;一个无符号字符&#xff09;的位置。测试代码 #include "stdio.h" #include "string.h"int main() {printf(&q…...

从源码层面深度剖析Spring循环依赖 | 京东云技术团队

以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1、Spring 如何创建Bean&#xff1f; 对于单例Bean来说&#xff0c;在Spring容器整个生命周期内&#xff0c;有且只有一个对象。 Spring 在创建 Bean 过程中&#xff0…...

Distance 2023牛客暑期多校训练营6 B

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;给出两个长度为n的数组a&#xff0c;b&#xff0c;每次操作可以令一个数1&#xff0c;将a的一个子集A变成和b的一个子集B变成完全相同需要的最少操作数为C(A,B)&#xff0c;求对于a的所有子集对所有b的子集的C(A,B)的…...

【Pandas】学习笔记之groupby()、agg()、transform()

在数据分析过程中经常需要对数据集进行分组&#xff0c;并且统计均值&#xff0c;最大值等等。那么 groupby() 的学习就十分有必要了 groupby(): 分组 官方文档&#xff1a; DataFrame.groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, observedF…...

使用正则表达式 移除 HTML 标签后得到字符串

需求分析 后台返回的数据是 这样式的 需要讲html 标签替换 high_light_text: "<span stylecolor:red>OPPO</span> <span stylecolor:red>OPPO</span> 白色 01"使用正则表达式 function stripHTMLTags(htmlString) {return htmlString.rep…...

Java中String方法魔性学习

这里写目录标题 先进行专栏介绍String详解常用构造方法代码演示常用成员方法代码示例总结 先进行专栏介绍 本专栏是自己学Java的旅途&#xff0c;纯手敲的代码&#xff0c;自己跟着黑马课程学习的&#xff0c;并加入一些自己的理解&#xff0c;对代码和笔记 进行适当修改。希望…...

Smartbi 权限绕过漏洞复现(QVD-2023-17461)

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…...

springboot自定义错误消息

为了提供自定义错误消息提示&#xff0c;springboot在resources目录下&#xff0c;有一个文件ValidationMessages.properties 用于存储 验证错误的消息提示&#xff1a; 比如&#xff1a; 这样一个ValidationMessage.properties username.notempty用户名不能为空 username.len…...

微信小程序申请步骤

微信公众平台链接&#xff1a;https://mp.weixin.qq.com/ 1、进到微信公众平台&#xff0c;点一下“点击注册”&#xff0c;挑选账号申请种类“小程序”&#xff0c;填好微信小程序用户信息&#xff0c;包含电子邮箱、登陆密码等。 2、微信公众平台会发送一封电子邮件&#xf…...

嘉楠勘智k230开发板上手记录(四)--HHB神经网络模型部署工具

按照K230_AI实战_HHB神经网络模型部署工具.md&#xff0c;HHB文档&#xff0c;RISC-V 编译器和模拟器安装来 一、环境 1. 拉取docker 镜像然后创建docker容器并进入容器 docker pull hhb4tools/hhb:2.4.5 docker run -itd --namehhb2_4 -p 22 "hhb4tools/hhb:2.4.5"…...

微信小程序的自定义TabBar及Vant的使用

一、安装Vant 1、在 资源管理器 空白位置&#xff0c;点右键打开 在外部终端窗口打开 2、初始化NPM npm init -y 3、安装命令 npm i vant/weapp1.3.3 -S --production 4、构建NPM包 在 工具 里选择构建NPM包 5、删除style:v2 在app.json里&#xff0c;删除"style"…...

canvas实现代码雨

学习抖音&#xff1a; 渡一前端必修课 效果图&#xff1a; 全部代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&…...

基于MFCC特征提取和HMM模型的语音合成算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 ............................................................................ %hmm是已经…...

多重网格算法的cuda编程

这里写自定义目录标题 多重网格算法介绍问题描述——五点差分法求解二维泊松方程五点差分法Gauss迭代算法限制算子介绍提升算子二重网格算法多重网格算法多重网格cuda代码编写串行代码mg.c两重网格cuda并行代码jacobi迭代的cuda编程device_jacobiMakefilecuda_mg.cucuda_mg.hma…...

DP(状态机模型)

大盗阿福 阿福是一名经验丰富的大盗。趁着月黑风高&#xff0c;阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N 家店铺&#xff0c;每家店中都有一些现金。 阿福事先调查得知&#xff0c;只有当他同时洗劫了两家相邻的店铺时&#xff0c;街上的报警系统才会启动&#x…...

按照指定的文件顺序进行scp传输

前言 scp 默认传输顺序是按照文件名进行排序的&#xff0c; 但我当前工作中遇到要验证两台机器的神经网络层的精度&#xff0c;需要把网络层的输入输出&#xff08;假设有100层&#xff0c; 一共64G) 从机器1传输到机器2 &#xff0c; 然后进行对比&#xff1b;这种情况下最好…...

小红书数据分析丨现实版模拟人生,这届网友热衷于“云开店”?

近期&#xff0c;小红书出现的一个神秘的热心群体&#xff0c;他们经常活跃在各种小店店主发布的求助帖评论区中&#xff0c;积极地帮助店主出谋划策&#xff0c;寻找小店经营的优化之道&#xff0c;成功帮助小店成功转亏为盈&#xff01;江湖人称一一云股东。小红书话题#爱上帮…...

休闲卤味强势崛起:卤味零食成为新一代热门美食

随着人们生活水平的提高和消费观念的转变&#xff0c;休闲卤味逐渐成为了人们日常生活中的热门美食。据最新数据显示&#xff0c;2022年&#xff0c;我国卤味市场销售额达到了约2000亿元&#xff0c;预计到2025年将突破3000亿元大关。其中&#xff0c;休闲卤味以每年10%的速度持…...

自除数-C语言

描述 给定两个整数 left 和 right &#xff0c;返回一个列表&#xff0c;列表的元素是范围 [left, right] 内所有的 自除数。 1 < left < right < 104 自除数 是指可以被它包含的每一位数整除的数&#xff0c;自除数 不允许包含 0 。例如&#xff0c;128 是一个 自除…...

-bash: ./startup.sh: Permission denied解决

今天在Linux上启动Tomcat&#xff0c;结果弹出&#xff1a;-bash: ./startup.sh: Permission denied 的提示。 这是因为用户没有权限&#xff0c;而导致无法执行。用命令chmod 修改一下bin目录下的.sh权限就可以了。 在Tomcat的bin目录下 &#xff0c;输入命令行 &#xff1a;c…...

Java课题笔记~ AOP 概述

AOP 简介 AOP&#xff08;Aspect Orient Programming&#xff09;面向切面编程。 面向切面编程是从动态角度考虑程序运行过程。 AOP的底层&#xff0c;就是采用动态代理的方式实现的。 采用了两种代理&#xff1a;JDK动态代理、CGLIB动态代理。 JDK动态代理&#xff1a;使…...

极客学院 网站建设/网站如何快速收录

2019独角兽企业重金招聘Python工程师标准>>> SQL Server 有个字段类型为 geography&#xff0c;这个类型存经纬度&#xff0c;就可以利用经纬度排序了。 &#xff08;注意&#xff0c;还有一个近似类型&#xff1a;geometry&#xff0c;这个是用来计算二维平面的&am…...

整合营销传播方案/阿亮seo技术

Atitit. 单点登录sso 的解决方案 总结 1. 系统应用场景and SSO模式选型 2 2. 系统应用的原则与要求 2 2.1. 开发快速简单::绝大部分系统来说&#xff0c;开发快速简单为主 2 2.2. 支持token交换&#xff0c;这样有利于集成先有的系统模块无需大改动&#xff0c;仅仅需要改动登…...

wordpress menu/新闻发稿渠道

题目描述&#xff1a; 守形数是这样一种整数&#xff0c;它的平方的低位部分等于它本身。 比如25的平方是625&#xff0c;低位部分是25&#xff0c;因此25是一个守形数。 编一个程序&#xff0c;判断N是否为守形数。 输入描述&#xff1a; 输入包括1个整数N&#xff0c;2<N…...

免费云服务器官网/seo关键词优化排名公司

Django中路由的作用 ​ 其本质是URL与要为该URL调用的视图函数之间的映射表&#xff1b;你就是以这种方式告诉Django&#xff0c;对于客户端发来的某个URL调用哪一段逻辑代码对应执行 简单的路由配置 # Django1.0版本 from django.conf.urls import urlurlpatterns [url(正则表…...

深圳市工程建设交易服务中心网站/他达那非片能延时多久

文章目录1.粘包现象演示2.半包现象演示3.粘包半包现象分析3.1 粘包3.2 半包4.粘包半包解决方案4.1短连接4.2 定长解码器4.3 行解码器4.4 LengthFieldBasedFrameDecoder4.5 LengthFieldBasedFrameDecoder演示参考黑马程序员1.粘包现象演示 我们通过一段代码演示一个这个粘包现象…...

宿迁网络公司/太原百度快照优化排名

有四个人要在深夜通过一座桥。这座桥最多只能承受两个人的重量&#xff0c;而且必须打着手电筒才能通过。四个人只有一把手电筒&#xff0c;并且每个人的行走速度也不一样&#xff1a;第一个人通过这座桥要花1分钟&#xff0c;第二个人要花2分钟&#xff0c;第三个人要花5分钟&…...