博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
队列(queue)
阅读量:6956 次
发布时间:2019-06-27

本文共 1632 字,大约阅读时间需要 5 分钟。

hot3.png

队列(queue)

1、概念

队列(queue)简称队,它也是一种运算受限制的线性表,其限制一端只能进行插入,另一端进行删除。

插入数据元素的一端称为队列的队尾(rear)。

删除数据元素的一端称为队列的队首(front)。

向队尾插入元素称为进队或入队。

从队列中删除元素称为离队或出队。

队列的运算规则是先进先出规则(First In First Out,FIFO)。

队列的入、出队操作分别具有入队和出队指针,通常以f(front)表示队首指针,r(rear)表示队尾指针。

2、ADT定义

ADT Queue{数据对象:D={ai|ai∈D0,i=0,1,2……n-1,D0为某一数据对象}数据关系:R={
|ai,ai+1∈D,i=0,1,2,……n-2}基本操作:getSize(); //获取队列的大小,即元素的个数isEmpty(); //判断是否为空,如果空返回trueenqueue(Object e); //e入队dequeue(); //队首元素出队。peek(); //获取队首元素,但不出队}

3、分类

队列的存储分为顺序存储和链式存储。

1.顺序队列

队列使用顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

顺序队列也必须使用一个向量空间来存放当前队列中的元素。

由于队列的队头和队尾的位置是变化的,因为需要设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时可以置为0.

当头尾指针相等时队列为空。在非空队列里,头指针是中指向队头元素,而尾指针始终指向队尾元素的下一个位置。

队列同堆栈一样也有上溢和下溢现象。此外队列中还存在“假溢出”显现。

假溢出是指在入队和出队操作中,头尾指针不断增加而不减小或只减小而不增加,致使被删除元素的空间无法重新利用,最后造成队列中有空闲空间,但是不能插入元素,也不能够删除元素。

解决假溢出最好的方法是使用循环队列。

2.循环队列

存储在循环向量中的队列称为循环队列(Circular Queue)。逻辑图如下:

如果不做任何限制,逻辑上,空队列和满队列的条件是一样的,条件为front=rear。 所以这里就需要区分队列是队空还是队满。

区分队空队满可以采取以下几种方法:

  • 第一:设置浪费一个空间单元。
  • 第二:设定一个变量来表示队列中的元素个数。

3.链式队列

定义链式队列的存储结构基本和线性表的定义相同,不过需要在结构中指明的是队首和队尾的数据类型不再是整型而是指针类型。

队列的各种运算比链式存储的普通线性表运算实现时方便得多,主要原因是队列的各种运算只能在队列的两端操作,队列是特殊的线性表。主要考虑队列的入队和出队的算法。

4、应用

1.合并两个队列

假设有两个队列,要求将两个队列合并到一起,合并时交替使用两个队列中的元素,并把剩余队列汇总的元素添加到最后,将新产生的队列返回。

public static Queue merge(ArrayDeque q1,ArrayDeque q2) {		Queue newQueue=new ArrayDeque<>();		while(!q1.isEmpty()&&!q2.isEmpty()) {			newQueue.add(q1.pop());			newQueue.add(q2.pop());		}		while(!q1.isEmpty()) {			newQueue.addAll(q1);			q1.clear();		}		while(!q2.isEmpty()) {			newQueue.addAll(q2);			q2.clear();		}		return newQueue;}

上一篇:

下一篇:

转载于:https://my.oschina.net/u/3754001/blog/2239968

你可能感兴趣的文章
HDU3336-Count the string(KMP)
查看>>
常用API接口签名验证参考
查看>>
Linux中find常见用法示例
查看>>
bootstrap 模态框动态加载数据
查看>>
初始化构造函数中定义的实体集合,方便嵌套类型的遍历
查看>>
深入理解css3中nth-child和 nth-of-type的区别
查看>>
MySQL慢查询Explain Plan分析
查看>>
MyBatis原理分析之三:初始化(配置文件读取和解析)
查看>>
180321
查看>>
Spark2.1.0之源码分析——事件总线
查看>>
Htmlparser专题
查看>>
大数据开发实战:数据平台大图和离线数据平台整体架构
查看>>
Spring MVC 3 深入总结
查看>>
Android自定义控件View(一)
查看>>
C/C++中的getline函数总结:
查看>>
【转】雪崩光电二极管(APD)偏置电源及其电流监测
查看>>
关于CAShapeLayer的一些实用案例和技巧
查看>>
Android中Service 使用详解(LocalService + RemoteService)
查看>>
使用scrapy抓取Youtube播放列表信息
查看>>
leetcode 简化路径
查看>>