【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

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 作者:高瑞冬 本文目录 * AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 * 一、MCP协议简介 * 二、创建MCP工具集 * 1. 获取MCP服务地址 * 2. 在FastGPT中创建MCP工具集 * 三、测试MCP工具 * 四、AI模型调用MCP工具 * 1. 调用单个工具 * 2. 调用整个工具集 * 五、私有化部署支持 * 1. 环境准备 * 2. 修改docker-compose.yml文件 * 3. 修改FastGPT配置 * 4. 重启服务 * 六、使用MCP-Proxy集成多个MCP服务 * 1. MCP-Proxy简介 * 2. 安装MCP-Proxy * 3. 配置MCP-Proxy * 4. 将MCP-Proxy与FastGPT集成 * 5. 高级配置

By Ne0inhk
【大模型实战篇】基于Claude MCP协议的智能体落地示例

【大模型实战篇】基于Claude MCP协议的智能体落地示例

1. 背景         之前我们在《MCP(Model Context Protocol) 大模型智能体第一个开源标准协议》一文中,介绍了MCP的概念,虽然了解了其概念、架构、解决的问题,但还缺少具体的示例,来帮助进一步理解整套MCP框架如何落地。         今天我们基于claude的官方例子--获取天气预报【1】,来理解MCP落地的整条链路。 2. MCP示例         该案例是构建一个简单的MCP天气预报服务器,并将其连接到主机,即Claude for Desktop。从基本设置开始,然后逐步发展到更复杂的使用场景。         大模型虽然能力非常强,但其弊端就是内容是过时的,这里的过时不是说内容很旧,只是表达内容具有非实时性。比如没有获取天气预报和严重天气警报的能力。因此我们将使用MCP来解决这一问题。         构建一个服务器,该服务器提供两个工具:获取警报(get-alerts)和获取预报(get-forecast)。然后,将该服务器连接到MCP主机(在本例中为Claude for Desktop)。         首先我们配置下环

By Ne0inhk
AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-ZEEKLOG博客 目录 引言 一、什么是DeepSeek? 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型训练与优化 4. 自动化推理与部署 5. 行业专用解决方案 三、蓝耘通义万相2.1与DeepSeek的对比分析 3.1 核心区别 3.2 结合使用的优势 四、蓝耘注册流程 五、DeepSeek与蓝耘通义万相2.1的集成应用 5.1 集成应用场景 1. 智能医疗诊断

By Ne0inhk
基于腾讯云HAI + DeepSeek快速设计自己的个人网页

基于腾讯云HAI + DeepSeek快速设计自己的个人网页

前言:通过结合腾讯云HAI 强大的云端运算能力与DeepSeek先进的 AI技术,本文介绍高效、便捷且低成本的设计一个自己的个人网页。你将了解到如何轻松绕过常见的技术阻碍,在腾讯云HAI平台上快速部署DeepSeek模型,仅需简单几步,就能获取一个包含个人简介、技能特长、项目经历及联系方式等核心板块的响应式网页。 目录 一、DeepSeek模型部署在腾讯云HAI 二、设计个人网页 一、DeepSeek模型部署在腾讯云HAI 把 DeepSeek 模型部署于腾讯云 HAI,用户便能避开官网访问限制,直接依托腾讯云 HAI 的超强算力运行 DeepSeek-R1 等模型。这一举措不仅降低了技术门槛,还缩短了部署时间,削减了成本。尤为关键的是,凭借 HAI 平台灵活且可扩展的特性,用户能够依据自身特定需求定制专属解决方案,进而更出色地适配特定业务场景,满足各类技术要求 。 点击访问腾讯云HAI控制台地址: 算力管理 - 高性能应用服务 - 控制台 腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力,只需简单的几步就能调用DeepSeek - R1

By Ne0inhk