Java成神之路:第三帖----数据结构与算法之队列
数据结构与算法--队列
今天掉了两根头发,摸掉的,记得 别乱摸,很珍贵的!!
什么是队列?
1)队列是一个有序列表,可以用数组或是链表来实现
2)遵循 先入先出 的原则。即:先存入队列的数据,要先取出。后存入的要后取出
3)示意图:(使用数组模拟队列示意图)

rear表示的是队列尾,front表示的是队列首,front值等于-1,表示队列数据首的前一位(用数组模拟队列,数组的下标第一个为0,用-1表示数据首的前一位),rear的值为-1,在这里我认为是为了和front保持一致,这样rear == front,表示数组为空!
用数组模拟队列的思路
队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中 max Size是该队列的最大容量,因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变,还是这个图嘻嘻~

** 当我们将数据存入队列时称为”addQueue”,addQueue的处理需要有两个步骤:
- 将尾指针往后移:
rear+1,当front == rear队列表示为空 (PS:数组头和数组尾在一起,能不空吗) - 若尾指针rear小于队列的最大下标 maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据
reaI == maxSize-1此时表示队列满 - 话不多说,上代码:**
package com.yishuai.queue;
public class ArrayQueueDemo {
public static void main(String[] args) {
//数据测试
ArrayQueue arrayQueue = new ArrayQueue(3);
}
}
class ArrayQueue {
private int maxSize;//最大容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//存放数据的数组,模拟队列
//队列初始化
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
front = -1;//指向队列的首部,分析出front指向队列头的前一个位置
rear = -1;//指向队列的尾部,指向队列尾部的最后一个数据
}
//判断队列是否满
public boolean isFull() {
return rear == maxSize - 1;
}
//判断队列是否空
public boolean isEmpty() {
return rear == front;
}
//将数据添加到队列
public void addQueue(int data) {
//如果队列已经满了,就不能再添加数据进入
if (isFull()) {
System.out.println("队列已经满了");
return;
}
rear++; //数据增加,队列尾的下标增加,队列头不变
arr[rear] = data;
}
//将数据从队列中取出
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空,没有数据可取");
}
front++;
return arr[front];
}
//展示出队列中的所有数据
public void showQueue() {
if (isEmpty()) {
System.out.println("队列为空,没有数据哦~");
}
for (int data : arr) {
System.out.print(data + "\t");
}
}
}
新的问题
因为此时的队列,采取的是一个链式的,也就意味着,当前面的数据被取出的时候,即使此时队列已经不是满的了,但是队列尾还是和maxSize - 1一样大,数据在插入的时候,仍然还是会显示:队列已经满啦~,此时我们如果想要解决这个问题,我们要使用: 环形队列
循环队列
有两种方法(坑了我几个小时):
第一种:
声明:font为头部第一个数据,rear为尾部最后一个数据的下一个位置
- 当
font == rear的时候,队列为空(这个没问题吧?) - 初始:
font == rear == 0,此时队列为空,当数据进入的时候,rear开始往后走,也就是+1 - 假如
maxSize=5,放入四个数据,也就是rear往后走了四步之后,rear=4了,数组有五个位置,但是里面只有四个数据,最后一个空的数据还没有放入,此时,假如rear再往前走一步,rear=5,但是数组的下标是从0开始的,也就是说,(0,1,2,3,4)这里就是五个单元格,到顶了 - 所以
rear到5的时候,只能往回走,也就是说,rear=4之后,不是rear=5,而是rear=0,此时font也等于0,font == rear了,刺激吧? - 前面说
font == rear时,队列为空,但是现在说font == rear时,队列又是为满的,哪里出错了吗?大部分人是不是和我一样的思想(也可能是我自恋),你没错,两个都是对的,所以呢,单纯的依靠font和rear已经不能满足判断的条件了,我的方法是再加入一个count计数,从0开始,加一个数据,count++,取一个数据,count--。count会在【0,5】之间变动,当font == rear且count=0时,队列为空,当font == rear且count=5时,队列为满,至于有效数据的个数,直接看count的值即可,这是第一种方法(我感觉比第二种好)!!
第二种(我和室友讨论了一个多小时,吐槽吐槽)
PS:重点来了!!!
这种方法有一个单元格是空的!!!假如最大空间为5,只能放入4个数据,还有一个空间,留着种水稻(粗口不断!),竟然不把空间用完,这也太浪费了,我看了3遍,想着应该不会这么傻吧,空间都不用完,家里有矿啊,还以为是自己哪里没弄懂,搞了一遍又一遍,和室友讨论了很久,也没得出结论,最后翻书解决了(不卖书,别私聊找我问哈),重复一遍,有一个空间是空的!!一直都是!!
这种方法,意思是:
声明:font为头部第一个数据,rear为尾部最后一个数据的下一个位置
- 当
font == rear的时候,队列为空(这个没问题吧?没问题吧?) - 假如
maxSize = 5,什么时候满了呢?当rear跑到4的时候就满了,也就是rear == 4,里面就四个数据,还有一个空间呢,重复:种水稻了(空的),所以(rear+1)% maxSize == font时,就满了(%是取余数,也叫取模,/是取商),rear+1什么意思?补上种水稻的那个空,然后再对maxSize取模,为什么取模?因为可能正好是和font同一圈,也有可能已经和font相差一圈了,所以要做取模操作。 - 那么有多少有效数据呢?可以直接看队列的长度,也就是 |rear-font|(取绝对值,问我为什么的先去面壁,再评论我给你回复),所以就可以写成这样
(rear+maxSize-font)%maxSize,
更新结束了,我头发又掉了两根,啊啊啊!!!
不点个赞再走,你对得起我头发吗,对得起吗?
Java成神之路:第三帖----数据结构与算法之队列的更多相关文章
- Java成神之路:第二帖---- 数据结构与算法之稀疏数组
数据结构与算法--稀疏数组 转换方法 记录数组有几行几列,有多少个不同的值 把不同的值的元素的行列,记录在一个小规模的数组中,以此来缩小数组的规模 如图: 二维数组转稀疏数组 对原始的二维数组进行遍历 ...
- Java成神之路:第一帖---- Vue的组件属性components用法
Vue的组件属性:components 使用场景 一般在项目的使用过程中,某个需要多次使用的模块,会将整个模块抽取出来,写一个组件,供给其他页面进行调用或者是在一个页面中,多次使用到一个重复的代码样式 ...
- Java成神之路[转]
阿里大牛珍藏架构资料,点击链接免费获取 针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所有知识点.欢迎关注. 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 ...
- java 成神之路
一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://i ...
- Java成神之路技术整理(长期更新)
以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 ...
- Java成神之路技术整理
关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具篇 Java 书籍篇 ...
- java成神之路
一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://i ...
- 转:Java工程师成神之路~(2018修订版)
转: http://www.hollischuang.com/archives/489 阿里大牛珍藏架构资料,点击链接免费获取 针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所 ...
- 【转】Java工程师成神之路
针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所有知识点.欢迎关注. 一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 h ...
随机推荐
- MySQL查看数据存放位置
show global variables like "%datadir%";
- 5.SSH 免密码登陆
SSH 免密码登陆 serverA 机器上 userA 用户,想要免密钥登陆到serverB机器上 1.集群中的所有机器 安装ssh 服务端sudo apt-get updatesudo apt-ge ...
- vscode下终端返回中文乱码
用python写个爬虫,配置个VScode环境,发现输出都是乱码,翻阅网站后发现一个简单有效的方法,在此谢过网络上的大牛们的无私分享,我也在此记录一下,以备后用: 文件---->首选项----& ...
- cinder migrate基础内容-1
一.卷迁移rest api接口 POST /v2/{project_id}/volumes/{volume_id}/action 迁移一个卷到特定的主机,在请求体中指定 os-migrate_volu ...
- 算法-搜索(6)B树
B树是平衡的m路搜索树. 根结点至少两个子女,根结点以外的非失败结点至少⌈m/2⌉个子女,所有失败结点都在h+1层. 第h层至少2⌈m/2⌉h-1个结点,因此失败结点数n+1≥2⌈m/2⌉h-1个. ...
- Intriguing properties of neural networks
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! https://arxiv.org/abs/1312.6199v4 Abstract 深度神经网络是近年来在语音和视觉识别任务中取得最新性 ...
- 高并发&性能优化(二)------系统监控工具使用
上一篇主要从总体介绍了高并发&性能优化的相关思路和方法,本篇主要介绍系统监控工具. [CPU查看工具] ------top命令(性能) 进入top命令后,按1即可看到每核CPU的运行指标与详细 ...
- 技术揭秘:华为云DLI背后的核心计算引擎
摘要:介绍隐藏在华为云数据湖探索服务背后的核心计算引擎Spark,玩转DLI,,轻松完成大数据的分析处理. 本文主要给大家介绍隐藏在华为云数据湖探索服务(后文简称DLI)背后的核心计算引擎——Spar ...
- 也谈基于Web的含工作流项目的一般开发流程
项目包含的通用模块代码等我有时间一并剥离贡献出来(基于WebSocket的通知引擎,工作流整合模块,自定义表单,基于RBAC权限设计),最近太忙了,Web项目有一段时间没碰,有点生疏的感觉,主要在忙G ...
- python yaml文件数据按原有的数据顺序dump
yml文件的更新后工具类: import os import yaml class YamlUtils(): def __init__(self,folder_name='config'): self ...