yub‘s Algorithm exercise Day13

用栈实现队列

link:232. 用栈实现队列 - 力扣(LeetCode)

思路分析

首先理清楚栈和队列的异同.
队列是先进先出 栈先进后出【两者都能存储元素】
再来看peek()和poll().
栈和队列都有peek() 可以称之为“瞄一眼”只是看一下当前栈顶/队头元素是什么.
栈中的pop()直接返回栈顶元素(出栈)
队列中的poll()在某种层面上就等效于pop()了.

先用栈1存储所有元素 再逐个pop到栈2中
最后pop栈2全部元素.
注意判断栈满(是否需要扩容)

class MyQueue {private Stack<Integer> stack1;private Stack<Integer> stack2;public MyQueue() {stack1 = new Stack<>();stack2 = new Stack<>();}//数据全部存在stack1中public void push(int x) {stack1.push(x);}public int pop() {//特殊 两者都为空if(empty()){return -1;}//先判断空 stack2不为空直接pop 统一从stack2出if(stack2.empty()){while(!stack1.empty()){//将stack1中的元素传到stack2中stack2.push(stack1.pop());}}return stack2.pop();}public int peek() {//特殊 两者都为空if(empty()){return -1;}//先判断空 stack2不为空直接pop 统一从stack2出if(stack2.empty()){while(!stack1.empty()){//将stack1中的元素传到stack2中stack2.push(stack1.pop());}}return stack2.peek();}public boolean empty() {return stack1.empty() && stack2.empty();}
}
class MyQueue {//创建需要的两个栈Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {//初始化stackIn = new Stack<>();stackOut = new Stack<>();}public void push(int x) {//入栈        stackIn.push(x);}public int pop() {dumpstackIn();return stackOut.pop();}public int peek() {dumpstackIn();return stackOut.peek();}public boolean empty() {return stackIn.isEmpty() && stackOut.isEmpty();}private void dumpstackIn() {if(!stackOut.isEmpty()) {return;}while(!stackIn.isEmpty()) {stackOut.push(stackIn.pop());}}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/
用队列实现栈

link:225. 用队列实现栈 - 力扣(LeetCode)

思路分析

由于队列是先进先出 想要模拟栈第二个队列就是起到备份的作用.
我们要获取q1最后入列的元素 那么就需要q2中间搭桥:
在这里插入图片描述

双队列解决
class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<>();queue2 = new LinkedList<>();  }public void push(int x) {queue2.offer(x);while(!queue1.isEmpty()){queue2.add(queue1.poll());//其实在无容量限制的情况下保持一致使用offer或者add}Queue<Integer> temp = new LinkedList<>();temp = queue1;queue1 = queue2;queue2 = temp; }public int pop() {return queue1.poll();}public int top() {return queue1.peek();}public boolean empty() {return queue1.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/
Question

push 方法中,使用 offeradd 都可以将元素插入到 queue2 中,但这两者有细微的区别。下面是解释为什么这里使用了 addoffer

区别

  • offer(E e):用于将元素插入到队列的尾部。如果队列有容量限制(如在阻塞队列中),而队列已满,offer 会返回 false,表示添加失败。
  • add(E e):同样将元素插入到队列的尾部,但如果队列已满(有容量限制时),add 会抛出 IllegalStateException

MyStack 实现中,因为使用的是 LinkedList 作为队列的底层实现,LinkedList 本身没有容量限制,所以在实际操作中 addoffer 的行为是相同的。

为什么 push 中既使用了 offer 又使用了 add

  1. offer 用于将新元素 x 加入 queue2。这是因为这个元素是新插入的,并且它是我们希望最终在栈顶部的元素。
  2. add 用于将 queue1 中剩余的所有元素移动到 queue2。在这个上下文中,queue1.poll() 会将 queue1 的元素逐个取出并添加到 queue2。这里使用 addoffer 都没有影响,因为 LinkedList 没有容量限制。
单队列解决

其实最开始思考用队列实现栈把末尾入队的元素放到队头即可 但是没有对知识点进行清晰的掌握 下附妙招.
Deque继承了Queue接口
Queue 中的 add、poll、peek等效于 Deque 中的 addLast、pollFirst、peekFirst

class MyStack {Deque<Integer> que1;public MyStack() {que1 = new ArrayDeque<>();}public void push(int x) {que1.addLast(x);}public int pop() {int tmp = que1.size()-1;while(tmp>0){que1.addLast(que1.peekFirst());que1.pollFirst();tmp--;}return que1.pollFirst();}public int top() {return que1.peekLast();}public boolean empty() {return que1.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/
.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456724.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于vue框架的的高校消防设施管理系统06y99(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;设备分类,设备信息,维修人员,报修信息,维修进度,院系,消防知识,培训记录,培训信息,备件信息,备件申请,派发信息,采购信息 开题报告内容 基于Vue框架的高校消防设施管理系统开题报告 一、项目背景与意义 随着高校规模的不断扩大和校园建…

61 mysql 存储引擎之动态格式 MyISAM

前言 我们这里来看一下 MyISAM 存储引擎, 我们常见的那些 user, db, table_priv, proc 等等是基于 MyISAM 这是我们经常会提及的 两种持久化的存储引擎之一, 一是 MyISAM存储引擎, 另外一个是 InnoDB存储引擎 我们这里来看一下 MyISAM 中动态长度的数据表的相关处理 mysql…

图片怎么转换成word文档?5种方法快速实现转换

不管是在学校学习还是在工作中&#xff0c;我们经常需要将图片中的文字转换成Word文档&#xff0c;以便于编辑和保存&#xff0c;但是很多小伙伴不知道该怎样转换&#xff0c;今天&#xff0c;就为大家介绍5种高效的图片转Word文档的方法&#xff0c;一起来学习下吧。 方法一&a…

IDEA设置JDK

IDEA设置JDK的前提是我们电脑中要下载安装了JDK 下面有JDK下载安装的详细教程 2024最新版JDK安装-CSDN博客文章浏览阅读3.4k次&#xff0c;点赞33次&#xff0c;收藏38次。安装JDK以及配置环境变量&#xff0c;检查是否安装成功_jdkhttps://blog.csdn.net/m0_61840987/articl…

威胁 Windows 和 Linux 系统的新型跨平台勒索软件:Cicada3301

近年来&#xff0c;网络犯罪世界出现了新的、日益复杂的威胁&#xff0c;能够影响广泛的目标。 这一领域最令人担忧的新功能之一是Cicada3301勒索软件&#xff0c;最近由几位网络安全专家进行了分析。他们有机会采访了这一危险威胁背后的勒索软件团伙的成员。 Cicada3301的崛…

笔记本电脑充不进去电怎么回事 笔记本电脑充不上电解决

当你满心欢喜地准备使用笔记本电脑&#xff0c;却突然发现它充不进去电&#xff0c;这无疑会让人感到十分困扰。究竟是什么原因导致了这一问题的出现呢&#xff1f;别着急&#xff0c;让我们一起来探寻笔记本电脑充不进去电的奥秘&#xff0c;并找到相应的解决办法。 一、原因…

批量修改YOLO格式的标注类别

1.解决的问题 假如你有一个YOLO格式的数据集&#xff0c;标注类别为0&#xff0c;1&#xff0c;2&#xff0c;3四个类别标签。如果你想删除标签1&#xff0c;只保留0&#xff0c;2&#xff0c;3类别的标注信息&#xff0c;或者想将标签0和标签1合并为标签1&#xff0c;只剩下标…

【Vulnhub靶场】DC-2

DC-2 靶场下载地址&#xff1a;https://download.vulnhub.com/dc/DC-2.zip 目标 本机IP&#xff1a;192.168.118.128 靶机IP&#xff1a;192.168.118.0/24 信息收集 常规我使用nmap三扫描&#xff0c;扫存活主机、扫端口、扫服务 第一步探测到存活主机IP为&#xff1a;192.1…

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro&#xff0c;点击“虚拟机—设置”&#xff0c;进入虚拟机设置页面 2、点击“网络适配器”&#xff0c;网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”&#xff0c;进入虚拟网络编辑器页面 4、选择桥接模式&#xff0c;并选择要桥接到的…

Docker 部署 EMQX 一分钟极速部署

部署 EMQX ( Docker ) [Step 1] : 拉取 EMQX 镜像 docker pull emqx/emqx:latest[Step 2] : 创建目录 ➡️ 创建容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建目录 mkdir -p /data/emqx/{etc,data,log}# 创建容器 docker run -d --name emqx -p 1883:1883 -p 1808…

内网穿透:如何借助Cloudflare连接没有公网的电脑的远程桌面(RDP)

内网穿透&#xff1a;如何借助Cloudflare连接没有公网的电脑的远程桌面(RDP)-含详细原理配置说明介绍 前言 远程桌面协议(RDP, Remote Desktop Protocol)可用于远程桌面连接&#xff0c;Windows系统&#xff08;家庭版除外&#xff09;也是支持这种协议的&#xff0c;无需安装…

代理与 Hubstudio 集成

文章目录 一、什么是 Hubstudio?二、为什么是动态住宅代理&#xff1f;三、使用 Hubstudio 设置 Smartdaili 代理3.1. 与动态住宅代理的整合 3.2. 使用 Hubstudio 设置代理 总结 将 Smartdaili 动态住宅代理与 Hubstudio 反检测浏览器配对使用&#xff0c;即可轻松管理多个账户…

npm、yarn、pnpm的workspaces使用

示例项目中总会遇到npm的packages中出现的workspaces键值对&#xff0c;自己的项目中没接触过这个东西&#xff0c;到底是什么&#xff1f;怎么用的&#xff1f;简单研究记录一下&#xff1a; abbrev是一个npm包&#xff0c;提供缩写展开功能。‌ 当你定义一个缩写后&#xff0…

设计一个html+css+js的注册页,对于注册信息进行合法性检测

综合使用HTML、JavaScript和CSS进行注册页面设计&#xff0c;实现以下若干功能&#xff1a; 注意整个页面的色调和美观使用FramesetTable布局&#xff08;div也可&#xff09;对用户ID和用户名、口令不符合条件及时判断对口令不一致进行及时判断&#xff08;34的及时判断&#…

使用 Pake 一键打包网页为桌面应用 / 客户端

项目 项目&#xff1a;https://github.com/tw93/Pake/ 免费ICO图片&#xff1a;https://icon-icons.com/zh/ 设置环境 以下教程仅针对windows系统适用 请确保您的 Node.js 版本为 18 或更高版本 文档&#xff1a;https://v1.tauri.app/zh-cn/v1/guides/getting-started/prerequ…

Web3的核心概念:去中心化如何改变互联网

Web3&#xff0c;作为互联网的下一代技术架构&#xff0c;正在重新定义用户与数据、平台之间的关系。与以往的Web2.0时代相比&#xff0c;Web3的核心在于去中心化的理念&#xff0c;旨在通过区块链等技术实现更高的透明度、安全性和用户控制权。 1. 数据的掌控与隐私保护 在W…

分页列表缓存

写这篇文章&#xff0c;我们聊聊分页列表缓存&#xff0c;希望能帮助大家提升缓存技术认知。 1 直接缓存分页列表结果 这是最简单易懂的方案&#xff0c;我们按照不同的分页条件查询出结果后&#xff0c;直接缓存分页结果 。 伪代码如下&#xff1a; public List<Product&…

基于LSTM-Transformer混合模型实现股票价格多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

修改huggingface的缓存目录以及镜像源

执行以下语句查看当前配置 huggingface-cli env默认输出应该如下 (py39-transformers) PS D:\py_project\transformers_demo> huggingface-cli envCopy-and-paste the text below in your GitHub issue.- huggingface_hub version: 0.26.1 - Platform: Windows-10-10.0.22…

09_实现reactive之代理 Set 和 Map

目录 创建代理建立响应式联系避免污染原始数据处理 forEachfor...ofvalues 与 keys 方法 Set 和 Map 都有特定的属性和方法来操作自身&#xff0c;因此需要单独处理。 创建代理 我们来看一段案例代码&#xff0c;体验一下和它们的独特之处&#xff0c;如下&#xff1a; const…