`
mixer_a
  • 浏览: 363648 次
社区版块
存档分类
最新评论

深度剖析Java数据结构之队列(一)——双端队列(ArrayDeque)

 
阅读更多

一、队列

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

二、双端队列

双端队列是只既可以在表的前端进行插入和删除操作,又可以在表的后端进行插入和删除操作。

三、ArrayDeque的实现

Java中的双端队列是用数组实现的,类的全限名称是java.util.ArrayDeque,该类的声明如下:

该类继承了AbstractCollection类,实现了Deque、Cloneable和Serializable接口。实现Cloneable和Serializable接口的主要目的是为了实现克隆和序列化。

该类中定义了四个个成员变量

其中elements是数组的首地址,head是指向队首的下标,tail是指向队尾的下一个位置的下标。MIN_INITIAL_CAPACITY 定义了在创建队列是,如果有指定长度,而且指定长度小于MIN_INITIAL_CAPACITY,则使用MIN_INITIAL_CAPACITY 作为数组的最小长度。

其构造函数有一下几种:

第一种构造函数,默认情况下,数组的长度为16。

第二种构造函数,给定数组长度,则调用allocateElements()函数,分配数组空间。allocateElements()函数的实现如下:

对于一个给定长度,先判断是否小于定义的最小长度,如果小于,则使用定义的最小长度作为数组的长度。否则,找到比给定长度大的最小的2的幂数(在if里面的以为语句实现这一功能)。

第三种构造函数,给定一个集合,先分配空间,然后添加到集合中。

从上面的三种构造函数中,可以判断出来,数组的长度是2的幂数,定义为2的幂数个人认为有两个原因:

1.伙伴系统

操作系统分配内存的方法使用伙伴系统的话,每一块的大小都是2的幂数,如果分配的内存大小为2的幂数,可以减少内存分配的时间。

伙伴系统在百度百科中的解释:http://baike.baidu.com/view/4935190.htm

2.插入和删除的速度

对于数组,如果head的值为0,时,在队首插入元素,有一种方法是将全部元素都向后移动一位,然后将新的元素插入。这样子的话,插入和删除的速度会非常慢,特别是在元素很多的情况下。另一种方法就是在head的值为0时,在队首插入元素,可以将head的值置为(数组的长度-1)。也就是将新插入的元素放到数组的最后,以此类推。在计算插入元素位置下标的时候,数组长度是2的幂数就用处了。下面是插入元素时,计算插入位置的值的语句

length-1的值为高位全为0,低位全为1,通过按位相与,可以得出应该插入元素的位置。
然后就是该类的一些方法了,有点面向对象的思想的都应该会想到,应该有头插,头删,尾插,尾删等等一些操作,在此就不一一列出了,实现起来也比较简单。关键还是要了解ArrayDeque的实现机制。

分享到:
评论

相关推荐

    数据结构与问题求解——java语言描述 源码

    本资料集是基于Java语言的实现,由著名计算机科学家Mark Allen Weiss所著的《数据结构与问题求解——java语言描述》(第三版)的源码。该书通过丰富的实例和深入的理论讲解,帮助读者理解和掌握各种经典的数据结构...

    数据结构与程序设计—— C++描述(高等教育出版社)

    《数据结构与程序设计——C++描述》是高等教育出版社出版的一本教材,由Bobert L. Kruse和Alexander J. Ryba共同编写。这本书深入探讨了如何使用C++语言进行数据结构的实现和程序设计,旨在帮助学生和程序员掌握数据...

    数据结构——车厢重排——队列问题

    ### 数据结构——车厢重排——队列问题 #### 核心知识点解析 ##### 1. 数据结构基础 在计算机科学中,数据结构是用于组织、管理以及存储数据的有效方式,以便能够高效地进行数据访问与修改操作。本案例中涉及的...

    双端队列C++实现 双端队列C++实现

    双端队列(Double-Ended Queue,简称deque)是一种线性数据结构,它允许在队列的两端进行插入和删除操作。在C++标准库中,`std::deque`是内置的双端队列容器,提供了高效且灵活的内存管理。然而,如果你想要自定义一...

    数据结构与算法答案——java语言描述

    队列则是先进先出(FIFO)的数据结构,广泛应用于任务调度、消息传递等,Java的`Queue`接口及其实现如`ArrayDeque`提供了队列的功能。 4. **哈希表**:哈希表(HashMap)是一种通过哈希函数将键映射到值的数据结构...

    VC++2010编程演练数据结构《1》循环双端队列

    循环双端队列(Circual Double Ended Queue,简称CDEQ或deque)是一种线性数据结构,它在数据操作上具有两端的扩展性。在循环双端队列中,元素可以像在普通队列中一样从一端(前端)添加(入队)和删除(出队),...

    经典数据结构队列的研究和实现.pdf

    在数据结构的学习和应用中,了解并掌握队列及其扩展结构——双端队列的原理和实现,对于成为一名合格的软件开发者至关重要。这不仅有助于理解计算机科学中的高级概念,例如算法和数据处理,也能在实际编程工作中提高...

    数据结构——队列的实现

    3. 高级数据结构实现:如Java的`java.util.Queue`接口,提供了多种队列实现,如`ArrayDeque`(基于数组的双端队列)、`LinkedList`(链表实现)等。 队列的应用场景: 1. 打印机任务调度:新任务入队,完成的任务出...

    【实验报告】 线性数据结构的实现与应用_双端队列_逆波兰式_呼叫中心_XAUAT_(原问题自杜克大学C++ Stacks and Queues and List

    本次实验的主要目的是理解和掌握线性数据结构——双端队列(Double-Ended Queue,简称deque)的实现与应用。通过实际编程,加深对双端队列特性的理解,如其在头部和尾部进行插入和删除操作的灵活性。同时,将双端...

    数据结构与算法分析——Java语言描述-带书签目录高清扫描版

    《数据结构与算法分析——Java语言描述》是一本深度探讨数据结构和算法的权威书籍,专为Java程序员设计。本书旨在帮助读者理解如何在实际编程中有效地使用数据结构和算法,提升程序性能和解决问题的能力。书中的内容...

    数据结构.doc————电子版_doc版

    数据结构.doc————电子版_doc版 数据结构是计算机科学中的一个基本概念,它是指计算机存储、组织和管理数据的方式。数据结构的研究对象是数据的逻辑结构、存储结构和算法结构。 数据结构的定义可以形式地表示为...

    数据结构与算法分析——Java语言描述

    《数据结构与算法分析——Java语言描述》是一本深度探讨数据结构和算法的专著,主要面向使用Java编程语言的读者。数据结构是计算机科学的基础,它涉及到如何在内存中组织和存储数据,以便高效地访问和操作。而算法则...

    java双端队列的实现-Java实现自定义双端队列(链表和数组两种方式) 数组和链表.pdf

    Java 中的双端队列(Deque)是一种特殊的队列,能够在队列的两端进行元素的添加和删除操作。与单端队列不同,双端队列可以在队列的头部和尾部同时进行插入和删除操作。 Java 实现自定义双端队列可以通过链表和数组...

    Java语言编写的数据结构-队列实现

    - **java.util.ArrayDeque类**:提供了双端队列功能,可以作为高效的顺序队列实现。 6. **队列的应用场景** - **任务调度**:操作系统中,进程调度器使用队列来存储待执行的任务。 - **缓冲区管理**:在网络传输...

    算法-数据结构和算法-5-队列和双端队列.rar

    本资源主要聚焦于两种常用的数据结构:队列和双端队列(deque),这些都是编程中不可或缺的部分,尤其是在处理顺序访问和存储的问题时。 首先,队列是一种遵循“先进先出”(FIFO)原则的数据结构。想象一下现实...

    Java数据结构之队列的简单定义与使用方法

    Java数据结构之队列是计算机科学中的一种基本数据结构,具有先进先出的特点。队列是一种特殊的线性表,元素的添加和删除只能在队列的两端进行,即队头和队尾。Java中实现队列的方法有多种,本文将详细介绍Java数据...

    数据结构——队列的应用.doc

    数据结构中的队列是一种线性数据结构,它遵循“先进先出”(FIFO, First In First Out)的原则。在本实验中,我们主要探讨了队列的应用,特别是在实现杨辉三角输出上的应用。 首先,我们需要理解循环队列。循环队列...

    数据结构课设——小大根交替堆实现的双端优先级队列及应用

    数据结构课设——小大根交替堆实现的双端优先级队列及应用 小大根交替堆是一种特殊的堆结构,它可以同时满足大根堆和小根堆的性质。在本文中,我们将对小大根交替堆实现的双端优先级队列进行详细的分析和设计。 ...

    邓俊辉版java 数据结构源码

    队列是先进先出(FIFO)的数据结构,Java的LinkedList类可以方便地实现队列功能,或者使用ArrayDeque类的双端队列特性。 树是一种非线性的数据结构,二叉树是其中最简单的一种,每个节点最多有两个子节点。AVL树是...

Global site tag (gtag.js) - Google Analytics