【Leetcode】队列实现栈和栈实现队列
目录
一.【Leetcode225】队列实现栈
1.链接
2.题目再现
3.解法
二.【Leetcode232】栈实现队列
1.链接
2.题目再现
3.解法
一.【Leetcode225】队列实现栈
1.链接
队列实现栈
2.题目再现

3.解法
这道题给了我们两个队列,要求去实现栈;
首先,我们要知道栈和队列的特征:
栈:后进先出,只能从栈顶入数据和出数据;
队列:先进先出,从队尾入数据,队头出数据;
根据这些特点,我们可以采用两边倒的方法来实现;
具体来说:
1.入栈时就是在不为空的队列插入数据,若两个队列都为空,就随便插入到一个队列中;
2.出栈时将不为空的队列的数据倒入为空的队列中,当不为空的队列就剩一个数据时,就停止向空队列倒数据,然后再删点那最后一个数据;
3.判空时,需要两个队列都为空,才算栈为空;
4.取栈顶元素即取不为空的队列的队尾元素,在取栈顶元素前要判断栈是否为空;
5.销毁栈时,要先销毁其中的两个队列,然后再销毁栈。
因为是用C语言实现的,所以得自己手搓个队列。
typedef int Qdatatype;typedef struct QueueNode
{struct QueeuNode* next;Qdatatype data;
}QueueNode;typedef struct Queue
{QueueNode* head;QueueNode* tail;
}Queue;
void Queueinit(Queue* pq)
{assert(pq);pq->head = NULL;pq->tail = NULL;
}void Queuedestroy(Queue* pq)
{assert(pq);QueueNode* cur = pq->head;while (cur != pq->tail){QueueNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;
}void Queuepush(Queue* pq, Qdatatype x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail");exit(-1);}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(pq->head);QueueNode* next = pq->head->next;if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{free(pq->head);pq->head = next;}
}Qdatatype Queuefront(Queue* pq)
{assert(pq);assert(pq->head);return pq->head->data;
}Qdatatype Queueback(Queue* pq)
{assert(pq);assert(Queuesize(pq) > 0);return pq->tail->data;
}int Queuesize(Queue* pq)
{assert(pq);int size = 0;QueueNode* cur = pq->head;while (cur != pq->tail->next){size++;cur = cur->next;}return size;
}bool Queueempty(Queue* pq)
{assert(pq);return pq->head == NULL;
}typedef struct
{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack*obj=(MyStack*)malloc(sizeof(MyStack));if(obj==NULL)exit(-1);Queueinit(&obj->q1);Queueinit(&obj->q2);return obj;
}void myStackPush(MyStack* obj, int x)
{if(!Queueempty(&obj->q1)){Queuepush(&obj->q1,x);}else{Queuepush(&obj->q2,x);}
}int myStackPop(MyStack* obj) {Queue*empty=&obj->q1;Queue*noempty=&obj->q2;if(!Queueempty(&obj->q1)){empty=&obj->q2;noempty=&obj->q1;}while(Queuesize(noempty)>1){Queuepush(empty,Queuefront(noempty));Queuepop(noempty);}int front=Queuefront(noempty);Queuepop(noempty);return front;
}int myStackTop(MyStack* obj) {if(!Queueempty(&obj->q1)){return Queueback(&obj->q1);}else{return Queueback(&obj->q2);}
}
bool myStackEmpty(MyStack* obj) {return Queueempty(&obj->q1)&&Queueempty(&obj->q2);
}void myStackFree(MyStack* obj) {Queuedestroy(&obj->q1);Queuedestroy(&obj->q2);free(obj);
}
二.【Leetcode232】栈实现队列
1.链接
栈实现队列
2.题目再现

3.解法
这个的解法和上面的类似,只不过这个不用总是来回倒;
根据栈和队列的特征,我们会发现将一个栈中的数据倒入另一个栈时,数据的顺序刚好符合队列的要求,不需要再重复地倒数据,所以我们可以让一个栈专门用来入数据(Pushst),一个栈专门用来出数据(Popst),当我们要出数据而这个栈为空时,我们才将用来入数据的栈中的数据倒入用来出数据的栈 。
如图:
1.判空时,需要两个栈都为空,队列才为空;
2.返回队头数据时,和出数据的操作类似,只是不需要删除队头的数据,还有在之前要判断队列是否为空;
3.销毁队列前,要先销毁两个栈。
同样,因为是C语言,得先手搓个栈。
#define MR_CAP 5
typedef int STdatatype;typedef struct Stack
{STdatatype* arr;int top;int capacity;
}ST;void Stackinit(ST* ps)
{assert(ps);ps->arr = (STdatatype*)malloc(MR_CAP * sizeof(STdatatype));if (ps->arr == NULL){perror("Stackinit malloc");exit(-1);}ps->top = 0;ps->capacity = MR_CAP;
}void Stackdestroy(ST* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->top = 0;ps->capacity = 0;
}void Stackpush(ST* ps, STdatatype x)
{assert(ps);if (ps->top == ps->capacity){STdatatype* tmp = (STdatatype*)realloc(ps->arr, ps->capacity * 2 * sizeof(STdatatype));if (tmp == NULL){perror("Stackpush realloc");exit(-1);}else{ps->arr = tmp;ps->capacity *= 2;}}ps->arr[ps->top] = x;ps->top++;
}void Stackpop(ST* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}STdatatype Stacktop(ST* ps)
{assert(ps);return ps->arr[ps->top - 1];
}int Stacksize(ST* ps)
{assert(ps);return ps->top;}bool Stackempty(ST* ps)
{assert(ps);if (ps->top == 0){return true;}elsereturn false;}typedef struct {ST Pushst;ST Popst;
} MyQueue;MyQueue* myQueueCreate() {MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));if(obj==NULL)exit(-1);Stackinit(&obj->Pushst);Stackinit(&obj->Popst);return obj;
}void myQueuePush(MyQueue* obj, int x) {Stackpush(&obj->Pushst,x);
}int myQueuePeek(MyQueue* obj) {if(Stackempty(&obj->Popst)){while(!Stackempty(&obj->Pushst)){Stackpush(&obj->Popst,Stacktop(&obj->Pushst));Stackpop(&obj->Pushst);}}return Stacktop(&obj->Popst);}int myQueuePop(MyQueue* obj) {int front=myQueuePeek(obj);Stackpop(&obj->Popst);return front;
}bool myQueueEmpty(MyQueue* obj) {return Stackempty(&obj->Pushst)&&Stackempty(&obj->Popst);
}void myQueueFree(MyQueue* obj) {Stackdestroy(&obj->Pushst);Stackdestroy(&obj->Popst);free(obj);
}
🐲👻这两道题的讲解就到这里了,若有错误或是建议欢迎小伙伴们指出。🐯🤖
🥰🤩希望小伙伴们可以多多支持博主哦。😍😃
😁😄谢谢你的阅读。😼😸

相关文章:
【Leetcode】队列实现栈和栈实现队列
目录 一.【Leetcode225】队列实现栈 1.链接 2.题目再现 3.解法 二.【Leetcode232】栈实现队列 1.链接 2.题目再现 3.解法 一.【Leetcode225】队列实现栈 1.链接 队列实现栈 2.题目再现 3.解法 这道题给了我们两个队列,要求去实现栈; 首先&…...
(一)Tomcat源码阅读:查看官网,厘清大概轮廓
一、进入官网 点击以下链接进入官网:Apache Tomcat - Welcome!,点击介绍进入介绍,查看tomcat的项目结构。 二、查看项目结构 进入介绍后,我们可以看到下面的这些东西,这些对于tomcat是比较重要的,我们要一一对其进行解读。 这段…...
刷题记录(2023.3.14 - 2023.3.18)
[第五空间 2021]EasyCleanup 临时文件包含考点 分析源码,两个特殊的点,一个是 eval,另一个是 include eval 经过了 strlen filter checkNums 三个函数 include 经过了 strlen filter 两个函数 filter 检测是否包含特定的关键字或字符 fun…...
http协议 - 笔记
1 http协议 -- post,get,delete 如何使用http协议post - /api/v1/User/1 要使用 HTTP 协议 POST 方法向 /api/v1/User/1 发送请求,您可以使用一个 HTTP 客户端(例如 Postman、cURL 或浏览器扩展程序)并按照以下步骤操作: 打开您的 HTTP 客户端。在 URL 地址栏中输入 /a…...
第十八天 Vue-前端工程化总结
目录 Vue-前端工程化 1. 前后端分离开发 1.1 介绍 1.2 Yapi 2. 前端工程化 2.1 环境准备 2.2 Vue项目简介 2.3 Vue项目开发流程 3. Vue组件库Element 3.1 快速入门 3.2 常用组件 3.3 案例 Vue-前端工程化 前面我们已经讲解了HTML、CSS、JavaScript以及Vue等知识。已…...
python网上选课系统django-PyCharm
学生选课信息管理系统,可以有效的对学生选课信息、学生个人信息、教师个人信息等等进行管理。 开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat11 开发软件&#x…...
Java序列化与反序列化
优秀博文:IT-BLOG-CN 序列化:把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。 反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。 一、序列化对象 【1】必须实现序列化接口Serializabl…...
【网络】网络层协议——IP
目录网络层IP协议IP基础知识IP地址IP报头格式网段划分CIDR特殊的IP地址IP地址的数量限制私有IP地址和公有IP地址路由IP总结网络层 在复杂的网络环境中确定一个合法的路径。 IP协议 IP协议作为整个TCP/IP中至关重要的协议,主要负责将数据包发送给最终的目标计算机…...
安装kubernetes
master110.10.10.10docker、kubelet、kubeadm、kubectlmaster210.10.10.11docker、kubelet、kubeadm、kubectlnode110.10.10.12docker、kubelet、kubeadm、kubectlnode210.10.10.13docker、kubelet、kubeadm、kubectl 1.关闭防火墙(所有节点执行) syste…...
三维点云转深度图
文章目录 目录 一、算法原理 算法流程 二、代码实现 1.Python代码 2....
Qt音视频开发27-ffmpeg视频旋转显示
一、前言 用手机或者平板拍摄的视频文件,很可能是旋转的,比如分辨率是1280x720,确是垂直的,相当于分辨率变成了720x1280,如果不做旋转处理的话,那脑袋必须歪着看才行,这样看起来太难受…...
python例程:《彩图版飞机大战》程序
目录开发环境要求运行方法《彩图版飞机大战》程序使用说明源码示例源码及说明文档下载路径开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统:Windows 7、Windows 10。 Python版本:Python 3.7.1。 开发工具:PyCharm 2018。…...
【前端八股文】JavaScript系列:Set、Map、String常用属性方法
文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和charAt()的区别charAt()和charCodeAt()方法的区别5个查找方法的区别如何把字符串分割为数组3个截取方法的区别大小写转换3个模式匹配方法(正则表达式)3个移除字符…...
跳跃-动态规划问题
跳跃-动态规划问题1、题目描述2、解题思路2.1 解法一:动态规划2.2 解法二:DFS深度优先搜索最大权值1、题目描述 小蓝在一个 n 行 m 列的方格图中玩一个游戏。 开始时,小蓝站在方格图的左上角,即第 11 行第 11 列。 小蓝可以在方格…...
Django笔记三十九之settings配置介绍
这一篇笔记介绍 Django 里 settings.py 里一些常用的配置项,这些配置有一些是在之前的笔记中有过介绍的,比如 logging 的日志配置,session 的会话配置等,这里就只做一下简单的回顾,有一些是之前没有介绍过的就着重介绍…...
【JavaSE】类和对象(中)
类和对象(中)4. this引用4.1 为什么要有this引用4.2 什么是this引用4.3 this引用的特性5. 对象的构造及初始化5.1 如何初始化对象5.2 构造方法(构造器)5.2.1 概念5.2.2 特性5.3 默认初始化5.4 就地初始化6. 封装6.1 封装的概念6.2…...
C语言例程:学生成绩管理程序
学生成绩管理程序 实例说明 编制一个统计存储在文件中的学生考试分数的管理程序。设学生成绩以一个学生一条记录的 形式存储在文件中,每个学生记录包含的信息有姓名、学号和各门功课的成绩。要求编制具有以 下几项功能的程序:求出各门课程的总分&#…...
完美日记母公司再度携手中国妇基会,以“创美人生”助力女性成长
撰稿 | 多客 来源 | 贝多财经 当春时节,梦想花开。和煦的三月暖阳,唤醒的不止是满城春意,更有逸仙电商“创美人生”公益项目播撒的一份希望。 3月8日“国际妇女节”当日,为积极响应我国促进共同富裕的政策倡导,助力相…...
【JaveEE】线程的创建及常见方法解析(Tread类)
目录 1.Tread类介绍 2线程的构造方法——创建线程 1.继承Thread类,重写run()方法 2.使用Runnbable接口创建线程 3.继承 Thread, 重写 run, 使用匿名内部类 4.实现 Runnable, 重写 run, 使用匿名内部类 5.使用 lambda 表达式(重点掌握)…...
Linux的诞生过程
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...


3.判空时,