JAVA数据结构与算法基础——队列(Queue)【云图智联】

在“队列”(Queue)这种数据结构中,数据项是先进先出(FIFO:first in first out)。队列的容量可以有限,也可以是无限的。

一、基于数组的Queue实现

一般情况下,对于Queue而言,最核心的操作是:插入队列(enqueue)、移出队列(dequeue)。因为在队列中,插入操作是插入到队列的最后,而移出操作是移出队列的头部元素。因此我们通常会使用两个变量front(队头指针)和rear(队尾指针)记录当前元素的位置。

假设我们有一个容量有限队列,用于存放字母,如下图所示:

当我们要插入一个元素时,因为总是插入到队列的最尾部,所以插入的位置是rear+1的位置。

当我们要移出一个元素时,是从队头指针front的位置开始移除(因为Queue头部的元素是最先加入进来的,根据FIFO原则,应该最先移除)。当移除一个元素之后,front应该加1,因为移出一个元素之后,下一个元素就变成了第一个元素。例如现在我们移出了5个元素:

6849E0CA-075B-445A-A13E-EE26A27EF04F.png

当移出5个元素之后,队头指针就移动到了字母F的位置,前五个位置空下来了。队尾指针rear不变。

现在问题来了:队列头部移出的几个元素,位置空下来了。当我们添加元素的时候,从队尾开始加,当添加到最后一个位置时,怎么办?不让添加时不合理的,毕竟前几个位置已经空下来了。我们的期望是,当一个位置上的元素被移出之后,这个位置是可以被重复使用的。而我们这里讨论的是有限容量的数据,如果我们还继续添加元素,那么就要往队列头部来添加。
这实际上就涉及到了循环队列的概念。也就是当队尾指针到了数组的最后一个下标时,下一个位置应该就是数组的首部。
 因此,当队尾指针指向数组顶端的时候,我们要将队尾指针(rear)重置为-1,此时再加1,就是0,也就是数组顶端例。如我们又添加了5个字母,那么结果应该如下图:

代码实现:

  1. package com.tianshouzhi.algrithm.queue;
  2.  
  3. import java.util.Arrays;
  4.  
  5.  
  6. /**
  7.  * 队列满足的条件是FIFO先进先出,本例是基于数组完成的Queue
  8.  * 
  9.  * @author Administrator
  10.  *
  11.  */
  12. public class ArrayQueue<T> {
  13.     Object[] data = null;
  14.     // 对头指针
  15.     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值