队列概述以及使用数组模拟实现队列(思路分析) [数据结构][Java]

队列概述以及用数组模拟实现队列(思路分析)

队列概述:

队列是一个有序列表,可以用数组或者链表来实现
队列遵循先入先出的原则
  • 也就是先存入队列的数据要先取出,后存入的数据后取出

数组模拟实现队列:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dygG2OpZ-1659251786882)(E:\非凡英才\数据结构(java)]\数据结构图解\使用数组模拟非环形队列示意图.png)

  • 队列本身是有序列表,若使用数组的结构存储队列的数据,则队列数组的声明如上图,其中maxSize是该队列的最大容量

  • 因为队列的输出和输入是分别从前后端来处理的,因此我们需要两个变量front和rear分别记录队列前端和后端的下标

    • 也就是说front和real其实都是队列类中封装的数组的索引
    • front会随着数据的输出而改变,rear会随着数据的输入而改变

      • real指向队尾元素,front指向队首元素的上一个位置,在刚刚初始化队列时rear和front的值都为-1,因为在我们这种设计之下front就应该都从-1开始比较简单,因为我们的front指向的是队列中第一个元素的上一个位置,这个时候由于Java中的数组的索引是从0开始的,那么这个时候我们的front又是从第一个位置的上一个位置开始的,这个时候front的初始化值就应该是-1,而为了方便,所以我们选择让rear的值也就初始化为-1
  • 队列为空的条件: front == rear

    • 注意: 这里只要front 等于 rear那么就是表示队列为空,而不是要front == real == -1
    • 那么为什么rear 等于 front就可以判断队列为空?
      • 其实很简单,我们的rear指向了队尾的元素,而front指向了队首元素的上一个位置,也就是front指向的位置是没有元素的,而当rear == front的时候,我们知道rear是指向了队尾元素的,那么这个时候这个位置即指向了队尾的元素又是不存在的,那么也就表示队尾元素是不存在的,而队尾元素不存在其实就是表中没有元素 --> 因为当表中有元素的话,即使表中只有仅仅一个元素,那么这一个元素也是既做了队首,又做了队尾
  • 队列满的条件: rear == maxSize-1时就表示队列是满的

    • 因为在我们这种非环形队列的设计之下,我们当rear,也就是队尾的下标到达maxSize-1(也就是数组中的最大索引位置)之后就表示队列满了,然后就不能向队列中添加元素了

      • 其实这里我们就是要理解,其实rear和front就是表示索引值的变量,而这个时候我们也要知道我们创建的数组长度是maxSize,这个时候我们其实通过以前的学习就知道,当我们创建一个长度为x的数组的时候,那么这个数组中的最大索引值为:x-1 —> 而我们这种方式下其实设计的队列时有问题的,这里设计的队列不是一个环形队列

        • 我们肯定知道我们队列时从后端添加,从前面删除的,那么这个时候我们设计的这种表对于删除了之后我们的前面的位置就空下来了,这个时候相当于那些空下来的位置已经没有用了,因为我们这个时候添加元素之后是在后面添加,所以这种方式设计的队列可以说是一种一次性使用的队列 ,而对于这种队列,当我们元素添加到数组的末尾的时候,那么就表示表示满的,后面我们会在数组模拟队列的具体代码实现中在测试的时候会继续讲到这个问题.

          • 并且我们会在讲到数组模拟环形列表的时候讲到如何解决这个问题
我们在向队列中添加元素的时候要判断队列是否已经满了,我们在删除队列中的数据的时候要判断队列是否已经为空了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值