【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

【python】全流程图文安装教程

【python】全流程图文安装教程

目录 一、前言 二、下载安装 2.1 官网下载 2.2 安装python 2.3 验证python是否可用 三、如何编写python文件代码 3.1 打开IDLE 3.2 新建脚本文件 3.3 编写脚本 3.4 运行脚本 一、前言 在数字化浪潮中,编程已成为一项“新通用技能”,而Python因其近乎零门槛的入门体验,成为无数人打开代码世界的第一把钥匙。无论你是想自动化办公、分析数据,还是探索人工智能,只需一行 print("Hello World") ,就能见证计算机对你的首次回应。 二、下载安装 2.1 官网下载

By Ne0inhk
【C++】继承

【C++】继承

继承 ✨前言:继承是C++面向对象编程的核心特性之一,它允许我们在已有类的基础上创建新类,实现代码的复用和功能的扩展。通过继承,我们可以构建出层次分明的类体系,让代码更加结构化、可维护。本文将深入探讨继承的各个方面,从基本概念到底层实现,帮助读者全面掌握这一重要特性。 📖专栏:【C++成长之旅】 目录 * 继承 * 一、继承的概念及定义 * 1.1 继承的概念 * 1.2 继承的定义 * 1.2.1 定义格式 * 1.2.2 继承基类成员访问方式的变化 * 1.3 继承类模板 * 二、基类和派生类间的转化 * 三、继承中的作用域 * 3.1 隐藏规则 * 3.2 考察继承作用域相关选择题 * 3.2.1

By Ne0inhk
【实用工具】无需安装!JupyterLab Online 在线运行 Python 代码(附完整教程)

【实用工具】无需安装!JupyterLab Online 在线运行 Python 代码(附完整教程)

【实用工具】无需安装!JupyterLab Online 在线运行 Python 代码(附完整教程) 文章目录 * 【实用工具】无需安装!JupyterLab Online 在线运行 Python 代码(附完整教程) * 一、为什么推荐JupyterLab Online? * 二、JupyterLab Online 完整使用教程(以运行matplotlib绘图代码为例) * 1. 进入在线环境 * 2. 创建Python文件 * 3. 运行代码(以绘图代码为例) * 4. 保存/下载文件(关键!) * 5. 关闭/退出 * 三、适用场景 & 注意事项 * ✅ 适用场景 * ❗ 注意事项 * 四、总结 一、为什么推荐JupyterLab Online?

By Ne0inhk
《C++ 递归、搜索与回溯》第1题:汉诺塔问题

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 《Git深度解析》:版本管理实战全解 🌟心向往之行必能至 🎥Cx330🌸的简介: 前言: 聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力 目录 前言: 递归,搜索与回溯算法前置知识 1. 汉诺塔 算法原理(递归): 思路: 算法流程: 解法代码(C++): 博主手记(字体还请见谅哈): 结尾: 递归,搜索与回溯算法前置知识 1. 汉诺塔 题目链接: 面试题 08.

By Ne0inhk