数据结构的队列

一.队列

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,来判断)

相关推荐
teacher伟大光荣且正确1 天前
关于Qt QReadWriteLock(读写锁) 以及 QSettings 使用的问题
java·数据库·qt
nightseventhunit1 天前
base64字符串String.getByte导致OOM Requested array size exceeds VM limit
java·oom
悟能不能悟1 天前
java map判断是否有key,get(key)+x,否则put(key,x)的新写法
java·开发语言
webbodys1 天前
Python文件操作与异常处理:构建健壮的应用程序
java·服务器·python
石工记1 天前
对称加密 vs 非对称加密图解详解
java·网络安全
不急不躁1231 天前
Android16 给应用默认获取权限
android·java
C雨后彩虹1 天前
5G网络建设
java·数据结构·算法·华为·面试
码界奇点1 天前
基于Spring Boot的后台管理系统设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理
爱敲点代码的小哥1 天前
json序列化和反序列化 和 数组转成json格式
java·前端·json
零度念者1 天前
Java IO/NIO 深度解析:从底层原理到高性能图片网关实战
java·nio