当前位置: 首页 > article >正文

代码随想录刷题day29|(栈与队列篇:队列)225.用队列实现栈

目录

一、队列基本知识

二、队列在Java中的实现

1.Queue

2.Deque

①实现普通队列

②实现栈

③实现双端队列

3.基于底层数据结构 

4.组合模式

三、相关算法题目

思路

代码

四、栈和队列总结


一、队列基本知识

队列只能在队尾添加元素,在队头删除元素,因此具有先进先出的特点(FIFO),比如排队,队列只能在首尾两端进行操作,做不到随机访问;

队尾入,队头处

常用操作方法:

入队(enQueue):将元素添加到队列的末尾,如果队列已满,可能会抛出异常或返回错误(取决于实现);

出队(deQueue):在队头移除并返回队列的第一个元素,如果队列为空,可能会抛出异常或者返回错误;

获得队首元素(peek):返回队列的第一个元素,但不移除它,如果队列为空,可能会抛出异常或返回错误;

判空(isEmpty):检查队列是否为空,为空,返回true,不为空,返回false;

获取队列长度(size):返回队列中元素的数量;

二、队列在Java中的实现

1.Queue

Queue是java中实现队列的接口(此处队列指普通队列,FIFO型),实现类有LinkedList(基于双向链表实现)、PriorityQueue(基于堆实现,元素按优先级出队),常用LinkedList;

Queue常用的方法有6个,分为3类:插入、移除、获取元素,每个方法存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null或false);

操作失败情况抛出异常返回特殊值(null / false)
将元素e插入到队尾超出队列容量boolean  add(E e)bollean  offer(E e):false
获取并移除此队列的头队列为空E  remove()E  poll()null
获取但不移除此队列的头队列为空        E  element()E  peek():null

参考:【Java】Java队列Queue使用详解_java queue-CSDN博客   博主:devnn

2.Deque

Deque 是一个双端队列接口,支持在两端插入和移除元素;继承自Queue接口;

Deque的实现类有ArrayDeque(基于动态数组实现)、LinkedList(基于双向链表实现)、LinkedBlocking Deque;

ArrayDeque在用作队列时快于LinkedList;

Deque有三种用途:普通队列、双端队列、栈,常用方法有12种,不同的数据结构实现选用不同方法;建议最好不要在Deque实现中插入null元素;

①实现普通队列

将元素添加到双端队列的末尾,从双端队列的开头移除元素,得到 FIFO(先进先出)行为

Deque<E> deque = new ArrayDeque<>();

Deque<E> deque = new LinkedList<>();

Queue<E> queue = new ArrayDeque<>();

Queue<E> queue = new LinkedList<>();

常用方法:从 Queue 接口继承的方法完全等效于 Deque 方法

Queue方法等效Deque方法

将指定元素插入Deque末尾

(入队)

抛出异常boolean  add(E e)void  addLast(E e)
返回特殊值bollean  offer(E e)boolean offerLast(E e)
获取并移除Deque第一个元素(出队)抛出异常E  remove()E  removeFirst()
返回特殊值E  poll()E  pollFirst()
获取但不移除Deque第一个元素抛出异常E  element()E  getFirst()
返回特殊值E  peek()E  peekFirst()

示例代码:

Deque<String> deque = new LinkedList<>();//创建一个LinkedList实现类的对象
//Deque<String> deque = new ArrayDeque<>();//创建一个ArrayDeque实现类的对象
deque.addLast("A");
deque.addLast("B");
System.out.println(deque.removeFirst()); // 输出: A

②实现栈

Deque<E> stack = new ArrayDeque<>();

Deque<E> stack = new LinkedList<>();

详见栈 

代码随想录刷题day28|(栈与队列篇:栈)232.用栈实现队列-CSDN博客

③实现双端队列

Deque<E> deque = new ArrayDeque<>();

Deque<E> deque = new LinkedList<>(); 

Queue<E> queue = new ArrayDeque<>();

Queue<E> queue = new LinkedList<>();

注意:Queue接口只能实现队列,Deque接口既能实现队列,也能实现栈;

参考:【Java】Java双端队列Deque使用详解_dequeuejava-CSDN博客

3.基于底层数据结构 

数组:使用循环数组实现

链表:使用单链表实现

了解即可

4.组合模式

原理类似栈,常用LinkedList(底层是链表)实现队列,ArrayList底层是基于动态数组,在ArrayList中,移除第一个元素会导致后面的所有元素向前移动一位,时间复杂度为O(n),如果出队操作频繁,时间开销比较大;

示例代码

import java.util.LinkedList;public class ComposedQueue<E> {private LinkedList<E> list;public ComposedQueue() {list = new LinkedList<>();}// 入队public void enqueue(E element) {list.addLast(element);}// 出队public E dequeue() {if (isEmpty()) {throw new IllegalStateException("队列为空");}return list.removeFirst();}// 查看队首元素public E peek() {if (isEmpty()) {throw new IllegalStateException("队列为空");}return list.getFirst();}// 判断队列是否为空public boolean isEmpty() {return list.isEmpty();}// 获取队列大小public int size() {return list.size();}
}

三、相关算法题目

225.用队列实现栈

思路

关键是出栈操作和获取栈顶元素操作,每次出栈时,将deque1中的元素倒序存入deque2中,原本元素队尾入,想要倒序就让元素从队头入,deque2运行addFirst(x)方法(从队头添加元素,元素顺序和deque1的入队出队顺序一致)即可实现,注意!倒序存入deque2的操作不需要在deque2为空时再操作,举个例子:

按照1 2 3的顺序

首先deque1执行push方法入队,deque1:(队头)1 2 3(队尾),相当于栈的入栈操作

deque2此时为空,将deque1中的元素倒序存入,deque2:3 2 1

deque2从队头出队:3 2 1,实现先进后出,相当于栈的出栈操作;

此时,按照4 5 的顺序再次入队deque1:4 5

如果之前deque2中只出队元素3,还剩元素2 1,此时不为空,假设时在deque2为空才运行addFirst方法,那么此时出栈操作,不会运行该方法,直接从deque2中移除元素,那么将会移除元素2,而在栈中,从栈顶往下应该是:5 4 2 1,应该出栈的是元素5

而每次出队时deque2都执行addFirst操作,此时deque2中:(队头)5 4 2 1(队尾)

出队元素为5,正确

代码

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

class MyStack {//成员变量Deque<Integer> deque1;Deque<Integer> deque2;public MyStack() {deque1 = new LinkedList<>();deque2 = new LinkedList<>();}    public void push(int x) {//deque1入队deque1.addLast(x);}    public int pop() {//deque1出队---倒序入队deque2---deque2出队method();return deque2.removeFirst();}public void method(){//确保deque2中包含的是deque1中所有元素的倒叙 不用借助数组 deque中有对应方法while(!deque1.isEmpty()){deque2.addFirst(deque1.removeFirst());}}public int top() {method();return deque2.getFirst();        }    public boolean empty() {return deque1.isEmpty() && deque2.isEmpty();}
}

四、栈和队列总结

java中栈和队列的实现有四种方式:

栈:Stack类、Deque接口、组合模式、底层数据结构(数组、链表)

队列:Queue接口和Deque接口、组合模式、底层数据结构(数组、链表)

其中Deque接口中两个实现类ArrayDeque和LinkedList都可以实现栈和队列,组合模式中通常封装List接口,创建其实现类ArrayList(底层数组)和LinkedList(底层链表)的实例对象,对于栈,常用ArrayList实现,对于队列,常用LinkedList实现;

对于栈,Stack类已经过时,java官方不推荐;

组合模式和底层数据结构的方式均需要手写方法,较为复杂,更推荐使用Deque接口;

相关文章:

代码随想录刷题day29|(栈与队列篇:队列)225.用队列实现栈

目录 一、队列基本知识 二、队列在Java中的实现 1.Queue 2.Deque ①实现普通队列 ②实现栈 ③实现双端队列 3.基于底层数据结构 4.组合模式 三、相关算法题目 思路 代码 四、栈和队列总结 一、队列基本知识 队列只能在队尾添加元素&#xff0c;在队头删除元素&a…...

Python安全之反序列化——pickle/cPickle

一&#xff0e; 概述 Python中有两个模块可以实现对象的序列化&#xff0c;pickle和cPickle&#xff0c;区别在于cPickle是用C语言实现的&#xff0c;pickle是用纯python语言实现的&#xff0c;用法类似&#xff0c;cPickle的读写效率高一些。使用时一般先尝试导入cPickle&…...

Deepin(Linux)安装MySQL指南

1.下载 地址&#xff1a;https://downloads.mysql.com/archives/community/ 2.将文件解压到 /usr/local 目录下 先cd到安装文件所在目录再解压&#xff0c;本机是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.创建软链…...

vue-fastapi-admin 部署心得

vue-fastapi-admin 部署心得 这两天需要搭建一个后台管理系统&#xff0c;找来找去 vue-fastapi-admin 这个开源后台管理框架刚好和我的技术栈所契合。于是就浅浅的研究了一下。 主要是记录如何基于原项目提供的Dockerfile进行调整&#xff0c;那项目文件放在容器外部&#xf…...

计算机视觉算法实战——三维重建(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 三维重建领域简介 三维重建&#xff08;3D Reconstruction&#xff09;是计算机视觉的核心任务之一&#xff0c;旨在通过多视角图像、视频…...

先进制造aps专题三十 用免费生产排程软件isuperaps进行长期生产计划制定

isuperaps是生产排产软件&#xff0c;同时也可以用来制定长期生产计划 通过isuperaps制定长期生产计划&#xff0c;一个指导原则就是大bom, 单工序&#xff0c;大bom的意思是bom中只包含主要的半成品和原料&#xff0c;单工序的意思是半成品/产品生产以工厂或车间为基本生产单…...

DeepSeek使用从入门到精通

1. DeepSeek概述 - DeepSeek是国产大模型&#xff0c;提供网页版和App版。因其强大功能&#xff0c;遭受网络攻击&#xff0c;但国内用户可直接使用。 2. 入门技巧 - 忘掉复杂提示词&#xff1a;用简洁明了的需求指令&#xff0c;AI能自我思考并生成优质内容 - 明确需求&#…...

迎接DeepSeek开源周[Kimi先开为敬]发布开源最新Muon优化器可替代 AdamW计算效率直接翻倍

Muon优化器在小规模语言模型训练中表现出色&#xff0c;但在大规模模型训练中的可扩展性尚未得到证实。月之暗面通过系统分析和改进&#xff0c;成功将 Muon 应用于 3B/16B 参数的 MoE 模型训练&#xff0c;累计训练 5.7 万亿 token。结果表明&#xff0c;Muon 可以替代 AdamW …...

【工作流】Spring Boot 项目与 Camunda 的整合

【工作流】Spring Boot 项目与 Camunda 的整合 【一】Camunda 和主流流程引擎的对比【二】概念介绍【1】Camunda 概念&#xff1a;【2】BPMN 概念 【三】环境准备【1】安装流程设计器CamundaModeler【画图工具】&#xff08;1&#xff09;下载安装 【2】CamundaModeler如何设计…...

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention&#xff08;GQA&#xff09;详解 Grouped-Query Attention&#xff08;GQA&#xff09; 是 Multi-Query Attention&#xff08;MQA&#xff09; 的改进版&#xff0c;它通过在 多个查询头&#xff08;Query Heads&#xff09;之间共享 Key 和 Value&am…...

docker基操

docker基操 首先就是安装docker使用docker:创建容器-制作一个镜像-加载镜像首先就是安装docker 随便找一个教程安装就可以,安装过程中主要是不能访问谷歌,下面这篇文章写了镜像的一些问题: 安装docker的网络问题 使用docker:创建容器-制作一个镜像-加载镜像 主要是参考:这篇…...

SF-HCI-SAP问题收集1

最近在做HCI的集成&#xff0c;是S4的环境&#xff0c;发现很多东西都跑不通&#xff0c;今天开始收集一下错误点 如果下图冲从0001变成0010&#xff0c;sfiom_rprq_osi表就会存数据&#xff0c;系统检查到此表就会报错&#xff0c;这个选项的作用就是自定义信息类型也能更新&a…...

当 OpenAI 不再 open,DeepSeek 如何掀起 AI 开源革命?

开源与闭源的路线之争成为了行业瞩目的焦点&#xff0c;DeepSeek掀起的 AI 开源风暴&#xff01; 一、硅谷“斯普特尼克时刻” 1957年&#xff0c;苏联将人类首颗人造卫星“斯普特尼克”送上太空&#xff0c;美国举国震动。 这颗“篮球”般的卫星&#xff0c;刺痛了自诩科技霸…...

理解 logits_to_keep = logits_to_keep + 1 在 _get_per_token_logps 中的作用

理解 logits_to_keep logits_to_keep 1 在 _get_per_token_logps 中的作用 source: anaconda3/envs/xxx/lib/python3.10/site-packages/trl/trainer/grpo_trainer.py def _get_per_token_logps(self, model, input_ids, attention_mask, logits_to_keep):# We add 1 to logi…...

论文笔记-WSDM2025-ColdLLM

论文笔记-WSDM2025-Large Language Model Simulator for Cold-Start Recommendation ColdLLM&#xff1a;用于冷启动推荐的大语言模型模拟器摘要1.引言2.前言3.方法3.1整体框架3.1.1行为模拟3.1.2嵌入优化 3.2耦合漏斗ColdLLM3.2.1过滤模拟3.2.2精炼模拟 3.3模拟器训练3.3.1LLM…...

DeepSeek与AI幻觉

AI幻觉&#xff08;AI Hallucination&#xff09; 是指人工智能系统&#xff08;尤其是生成式模型&#xff0c;如大型语言模型或图像生成模型&#xff09;在输出内容时&#xff0c;生成与事实不符、逻辑混乱或完全虚构的信息的现象。这种现象类似于人类的“幻觉”&#xff0c;即…...

Linux 命令大全完整版(09)

4. 压缩与解压缩命令 ar 功能说明&#xff1a;建立或修改备存文件&#xff0c;或是从备存文件中抽取文件。语法&#xff1a;ar[-dmpqrtx][cfosSuvV][a<成员文件>][b<成员文件>][i<成员文件>][备存文件][成员文件]补充说明&#xff1a;可让您集合许多文件&a…...

deepseek_清华大学指导手册_pdf_1-5

deepseek_清华大学指导手册_pdf_1-5 无套路&#xff0c;无需关注&#xff0c;无需登录&#xff0c;无需app&#xff0c;直接下载&#xff1a; 下载地址 文件列表&#xff1a; 001_清华大学_DeepSeek从入门到精通.pdf 002_清华大学_DeepSeek如何赋能职场应用.pdf 003_清华大学…...

深度学习-127-LangGraph之基础知识(四)自定义状态添加额外字段的聊天机器人

文章目录 1 自定义状态2 自定义工具2.1 完善工具human_assistance2.2 浏览器工具baidu_search3 聊天机器人3.1 绑定工具的聊天模型3.2 聊天机器人(带记忆)4 调用图4.1 调用工具时中断4.2 人工提供信息恢复4.3 查询存储的状态4.4 手动更新状态5 参考附录使用LangGraph,在状态中…...

自定义实现简版状态机

状态机&#xff08;State Machine&#xff09;是一种用于描述系统行为的数学模型&#xff0c;广泛应用于计算机科学、工程和自动化等领域。它通过定义系统的状态、事件和转移来模拟系统的动态行为。 基本概念 状态&#xff08;State&#xff09;&#xff1a;系统在某一时刻的特…...

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…...

Python pip 缓存清理:全面方法与操作指南

在使用 Python 的 pip 进行包安装时&#xff0c;pip 会将下载的包缓存起来&#xff0c;以加快后续相同包的安装速度。不过&#xff0c;随着时间推移&#xff0c;缓存会占用大量磁盘空间&#xff0c;这时你可以对其进行清理。下面为你介绍不同操作系统下清理 pip 缓存的方法。 …...

Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法

明确需要编辑器和编译器&#xff0c;并选择自己要用什么&#xff08;我选的编辑器是VSCode&#xff1a;Visual Studio Code&#xff1b;编译器是gcc&#xff09;下载VSCode并配置环境变量&#xff08;这里没啥问题&#xff09;&#xff0c;安装C/C的拓展安装Cygwin&#xff0c;…...

Python开发Django面试题及参考答案

目录 Django 的请求生命周期是怎样的? Django 的 MTV 架构中的各个组件分别是什么? Django 的 URL 路由是如何工作的? Django 的视图函数和视图类有什么区别? Django 的模板系统是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中间件是什么?它的作用是…...

PyTorch v2.6 Overview

PyTorch v2.6 Overview Python APILibraries PyTorch 是一个优化的张量库&#xff0c;用于使用 GPU 和 CPU 进行深度学习。 Python API 序号API名称解释1torchPyTorch 核心库(中文:火炬)PyTorch 的核心库&#xff0c;提供了张量操作、自动求导等基础功能。2torch.nn神经网络模…...

智慧废品回收小程序php+uniapp

废品回收小程序&#xff1a;数字化赋能环保&#xff0c;开启资源循环新时代 城市垃圾治理难题&#xff0c;废品回收小程序成破局关键 随着城市化进程加速与消费水平提升&#xff0c;我国生活垃圾总量逐年攀升&#xff0c;年均增速达5%-8%&#xff0c;其中超30%为可回收物。然…...

【p-camera-h5】 一款开箱即用的H5相机插件,支持拍照、录像、动态水印与样式高度定制化。

【开源推荐】p-camera-h5&#xff1a;一款轻量级H5相机插件开发实践 一、插件背景 在Web开发中&#xff0c;原生摄像头功能的集成往往面临以下痛点&#xff1a; 浏览器兼容性问题视频流与水印叠加实现复杂移动端适配困难功能定制成本高 为此&#xff0c;p-camera-h5 —— 一…...

python~http的请求参数中携带map

背景 调试 http GET请求的 map 参数&#xff0c;链路携带参数一直有问题&#xff0c;最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...

网页版的俄罗斯方块

1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…...

创建虚拟环境以及配置对应的项目依赖

文章目录 首先创建一个虚拟环境&#xff0c;创建一个名字为myenv,并且版本为xxx的虚拟环境 conda create --name myenv pythonxxx激活虚拟环境 conda activate myenv下载所需的依赖&#xff0c;如果有requirements.txt文件 pip install -r requirements.txt容易出现的错误&a…...