数据结构的队列

一.队列

1.队列(Queue)的概念就是先进先出。

2.队列的用法,红色框和绿色框为两组,offer为插入元素,poll为删除元素,peek为查看元素红色的也是一样的。

3.LinkedList实现了Deque的接口,Deque又继承于Queue所以,LinkedList可以实现Queue接口

4.这里先删除的1,因为队列是先进先出。然后再不断的取第一个元素。(offer是尾插poll是头删)

二.链表实现队列

通过双向链表的尾插和头删就可以进行队列的模拟比较简单不赘述:

三.数组实现队列

1.这里需要用到循环的数组来进行实现队列。

2.这里我们有三种方法可以来判断数组是否放满或者为空:(下面是我用第3个方法来实现这个队列)

3.这里计算last的位置的时候不能直接++或者用first(头)++,因为一直++可能会越界,所以这里用(last + 1) % len(数组的长度),这样就不会越界。

4.代码展示:

循环数组作为队列,需要头和尾,头来进行删除数据,尾部进行插入数据,在扩建数组的长度的时候需要注意我要把数组的大小增大一倍,因为我是通过判断下一个位置是否为头来判断数组是否满了。这里还需要注意的是,删除数据的时候我们要知道,first也要和last一样通过公式(last + 1) % len(数组的长度)来计算。还需要注意的是获取队尾元素的时候,last可能会在0位置,那么就没办法last-1来找到这个数据了,这个时候我们要通过判断last是否为0,如果为0就直接返回数组长度-1作为下标来获取队尾元素,不能直接返回0的下标,因为你要获取的是队尾元素相当于是0的上一个数据是队尾-1元素的下标的数据,而不是0位置这个数据.

7.双端队列(Deque):两边都可以入队和出队。并且这里还可以通过双端队列来实现队列和栈。需要注意的是Deque是接口,需要创建一个LinkedList的对象才能实现:

8.用法一看便知:

9.队列实现栈:(这里我们是通过两个队列来实现栈的,我们规定两个队列都为空的时候第一个队列存放数据,pop是通过将部位空的队列的n-1个数据移动到空队列中,再将最后一个数据pull出去就是栈pop的元素,获取栈顶元素也是同样的思路,但是栈顶元素需要将n个数据传入到空队列中,并且保存下最后一个数据)

10.栈实现队列:(思路就还是两个栈来实现这个队列,不管什么情况都是把数据放在第一个栈中,当需要队列poll数据的时候我自己实现的两个栈就需要把第一个栈的数据全部pop到第二个栈中来push然后再通过第二个栈来push,因为这样到第二个栈的时候数据就是倒过来的就可以直接push。代码中再pop的时候没有进行判断两个栈是否为空,如果两个栈都为空要返回--1,来判断)

相关推荐
cheems9527几秒前
[SpringMVC] SpringWebMVC常见注解介绍
java·springmvc·注解
me8321 分钟前
【Java】Spring MVC接口执行流程详解:从前端请求到参数封装全解析(前端到底是怎么和后端交互的?)
java·spring·mvc
niucloud-admin3 分钟前
插件开发——upgrade 插件版本升级
java
vortex53 分钟前
Gradle 从入门到实战
java·gradle
代码丰4 分钟前
Zero Code Studio:LangChain4j 工具调用 + LangGraph4j 工作流双模式的 AI 网站生成系统
java·人工智能
云烟成雨TD32 分钟前
Spring AI 1.x 系列【28】基于内存和 MySQL 的多轮对话实现案例
java·人工智能·spring
Lyyaoo.34 分钟前
【JAVA基础面经】String、StringBuffer、StringBuilder
java·开发语言
TeamDev40 分钟前
JxBrowser 8.18.2 版本发布啦!
java·前端·跨平台·桌面应用·web ui·jxbrowser·浏览器控件
晴天sir44 分钟前
Redis 在业务中的几种典型用法
java·数据库·redis
WJX_KOI1 小时前
MemOS —— 为大语言模型 (LLMs) 和智能体打造的记忆操作系统。
java·人工智能·语言模型