【LeetCode 经典题解】:队列与栈的双向模拟——从原理到代码详解

【LeetCode 经典题解】:队列与栈的双向模拟——从原理到代码详解
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述


【前言】

数据结构中,栈(后进先出)和队列(先进先出)特性迥异。本系列聚焦LeetCode经典题:队列实现栈与栈实现队列,剖析如何突破结构限制,实现特性互模拟,助你深入理解两者本质。

文章目录:

一、队列实现栈

LeetCode:队列实现栈


在这里插入图片描述

1.思路分析

两个队列实现栈,使用LinkedList来模拟队列,因为LinkedList实现了Queue接口,支持队列的标准

入队:统一入到不为空的队列中;出队:将size-1个元素放到另一个队列,出剩下的那一个

在这里插入图片描述

2.代码详解

创建q1,q2两个队列,并实例化,因为LinkedList实现了Queue接口
publicQueue<Integer> q1;publicQueue<Integer> q2;publicMyStack(){ q1 =newLinkedList<>(); q2 =newLinkedList<>();}
当两个队列都为空时,则栈空
publicbooleanempty(){return q1.isEmpty()&& q2.isEmpty();}

2.1 push(int x)

判断q1,q2是否为空,直接添加元素到不为空的那个队列,如果都为空,就添加到q1
publicvoidpush(int x){if(!q1.isEmpty()){ q1.offer(x);}elseif(!q2.isEmpty()){ q2.offer(x);}else{ q1.offer(x);}}

2.2 pop()

如果队列都为空,就返回-1。然后分开判断,q1不为空时,将它的size-1个元素转移到q2,然后出剩下的那个元素,q2不为空时,将它的size-1个元素转移到q1,然后出剩下的那个元素
publicintpop(){if(empty()){return-1;}if(!q1.isEmpty()){int size = q1.size();while(size -1!=0){int val = q1.poll(); q2.offer(val); size--;}return q1.poll();}else{int size = q2.size();while(size -1!=0){int val = q2.poll(); q1.offer(val); size--;}return q2.poll();}}

2.3 top()

跟pop()一样,需要改变的就是转移元素的个数为·size·,这样转移完成时,载体val中保留的就是最后要获取的那个元素,直接返回就行
publicinttop(){int val =1;if(empty()){return-1;}if(!q1.isEmpty()){int size = q1.size();while(size !=0){ val = q1.poll(); q2.offer(val); size--;}return val;}else{int size = q2.size();while(size !=0){ val = q2.poll(); q1.offer(val); size--;}return val;}}

二、栈实现队列

LeetCode:栈实现队列


在这里插入图片描述

1.思路分析

用两个双端队列Deque当作栈,LinkedList实现了Deque接口(也可以用LinkedList当作栈)

入栈:所有元素先放到第一个栈中;出栈:
1.如果第二个栈为空,就将s1栈中元素放到s2中,这样就会倒过来;
2.如果不为空,直接出s2栈顶元素两个队列都为空,则模拟的栈是空的
在这里插入图片描述

2.代码分析

先创建两个栈,然后实例化。LinkedList实现了Deque接口(也可以用LinkedList当作栈)
publicDeque<Integer> s1;publicDeque<Integer> s2;publicMyQueue(){ s1 =newLinkedList<>(); s2 =newLinkedList<>();}
当两个栈都为空时,则队列空
publicbooleanempty(){return s1.isEmpty()&& s2.isEmpty();}

2.1 push(int x)

直接放到s1中
publicvoidpush(int x){ s1.push(x);}

2.2 pop()

先判断栈是否为空,然后当s2为空时,就可以将s1中所有元素,转移过来,然后出s2栈顶元素
publicintpop(){if(empty()){return-1;}if(s2.isEmpty()){while(!s1.isEmpty()){ s2.push(s1.pop());}}return s2.pop();}

2.3 peek()

与pop() 一样,转移过来后,获取s2栈顶元素
publicintpeek(){if(empty()){return-1;}if(s2.isEmpty()){while(!s1.isEmpty()){ s2.push(s1.pop());}}return s2.peek();}

四、完整代码

1.队列实现栈

publicclassMyStack{publicQueue<Integer> q1;publicQueue<Integer> q2;publicMyStack(){ q1 =newLinkedList<>(); q2 =newLinkedList<>();}publicvoidpush(int x){if(!q1.isEmpty()){ q1.offer(x);}elseif(!q2.isEmpty()){ q2.offer(x);}else{ q1.offer(x);}}publicintpop(){if(empty()){return-1;}if(!q1.isEmpty()){int size = q1.size();while(size -1!=0){int val = q1.poll(); q2.offer(val); size--;}return q1.poll();}else{int size = q2.size();while(size -1!=0){int val = q2.poll(); q1.offer(val); size--;}return q2.poll();}}publicinttop(){int val =1;if(empty()){return-1;}if(!q1.isEmpty()){int size = q1.size();while(size !=0){ val = q1.poll(); q2.offer(val); size--;}return val;}else{int size = q2.size();while(size !=0){ val = q2.poll(); q1.offer(val); size--;}return val;}}publicbooleanempty(){return q1.isEmpty()&& q2.isEmpty();}}

2.栈实现队列

publicclassMyQueue{publicDeque<Integer> s1;publicDeque<Integer> s2;publicMyQueue(){ s1 =newLinkedList<>(); s2 =newLinkedList<>();}publicvoidpush(int x){ s1.push(x);}publicintpop(){if(empty()){return-1;}if(s2.isEmpty()){while(!s1.isEmpty()){ s2.push(s1.pop());}}return s2.pop();}publicintpeek(){if(empty()){return-1;}if(s2.isEmpty()){while(!s1.isEmpty()){ s2.push(s1.pop());}}return s2.peek();}publicbooleanempty(){return s1.isEmpty()&& s2.isEmpty();}}

三、总结

“队列实现栈”与“栈实现队列”均通过双结构协作+元素转移实现特性突破:前者借两个队列的转移让“先进先出”模拟“后进先出”;后者靠两个栈的分工让“后进先出”模拟“先进先出”。核心收获是理解结构特性的灵活转化——看似对立的栈和队列,可通过逻辑设计实现功能互通。掌握这种思维,能为解决复杂算法问题拓宽思路,助力你在数据结构领域的学习与实践。

Read more

机器人 - 关于MIT电机模式控制

目录 一、MIT电机模式简单介绍 1.1 简单介绍 1.2 MIT模式的控制参数 1.3 使用场景 二、调试时建议 2.1 调试 2.2 问题定位 一、MIT电机模式简单介绍 1.1 简单介绍 Mixed Integrated Torque为一种混合控制模式,在同一帧CAN数据里包含 位置、速度、扭矩三类的闭环指令。驱动器里面把位置环、速度环、前馈扭矩相加,得到一个参考电流,然后再交给电流环完成精准扭矩输出。 1.2 MIT模式的控制参数 参数含义取值范围(常见)说明kp位置比例系数(刚度)0 ~ 500 (单位视驱动器而定)kp = 0 时位置环失效,

By Ne0inhk
低代码结合大模型:中小企业半天构建专属SaaS应用的完整路径

低代码结合大模型:中小企业半天构建专属SaaS应用的完整路径

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕AI这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * 低代码结合大模型:中小企业半天构建专属SaaS应用的完整路径 😊 * 低代码与大模型:强强联合 💪 * 半天构建SaaS应用的路径 🛠️ * 阶段1: 需求分析与规划(1小时) 📋 * 阶段2: 平台设置与环境配置(1小时) ⚙️ * 阶段3: 应用开发与智能集成(2小时) 🎨 * 阶段4: 测试与部署(2小时) 🚀 * 最佳实践与注意事项 ⚠️ * 结语 🌟 低代码结合大模型:中小企业半天构建专属SaaS应用的完整路径 😊 在当今数字化浪潮中,中小企业往往面临资源有限、技术门槛高的挑战,难以快速构建定制化的SaaS(软件即服务)应用。然而,随着低代码平台和大型语言模型(LLM)的融合,这一局面正在改变。通过

By Ne0inhk
Nano Banana进行AI绘画中文总是糊?一招可重新渲染,清晰到可直接汇报

Nano Banana进行AI绘画中文总是糊?一招可重新渲染,清晰到可直接汇报

文章目录 * 1. 为什么 Nano Banana 生成的中文经常不清晰? * 2. 解决思路:Nano Banana + Seedream 4.5 的两段式工作流 * 3. 实战:先用 Nano Banana 生成架构图(中文会糊) * 4. 部署 Personal LLM API,并配置 Seedream 4.5 * 5. 用 Cherry Studio 配置已部署的 LLM 接口 * 6. 关键一步:用 Seedream 4.5 对“中文文字重新渲染” * 7. 效果对比:字清晰、无错位、图形保持不变

By Ne0inhk
DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 目录 DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 前  言 1 环境准备 1.1 华为云开发环境 1.2 ModelArts 代金券与模型服务 1.3 启动 OpenClaw 网关 2 飞书开放平台配置 2.1 创建企业自建应用 2.2 添加机器人能力 2.3 配置应用权限 2.4 发布应用版本 3 OpenClaw 与飞书集成 3.1 配置 OpenClaw

By Ne0inhk