//循环双端队列:Circle Double Ended Queue
//本质是对动态数组的优化
//队头队尾都可以添加或删除元素
//相比于普通循环队列需要注意的点是在队头插入元素时的对front前移的处理public class CircleDequeZH<E> {private int size;private int front;private  E elements[];private static final int DEFAULT_CAPACITY = 10;public CircleDequeZH() {elements = (E[]) new Object[DEFAULT_CAPACITY];}private int getMo(int a, int b){return a > b ? (a-b) : a;//%运算效率太低,当a<2b时可以用这个表达式替代取模,而循环队列front+index最大等于2*length-1,恰好符合要求}//计算队头队尾元素下标可以写一个函数,用来映射循环队列中的真实索引public int realIndexCaculate(int index){if (index<0){return getMo((index + front + elements.length), elements.length);//当front=0时,我们在队头插入元素,front要前移,也就是到整个数组的末尾,所以单独写一个if应对这种情况//这时候front的新位置为(front-1+length)%length}return getMo((index+front),elements.length);//!!!//就是要找队列中的下标为index的(第index+1个)元素,返回它在我们数组里的真实下标//我觉得影响以后的可读性就没用}private void ifNeedEnLarge(int needCapacity){int oldcapacity = elements.length;if (needCapacity<=oldcapacity){return;}else{int newcapacity = oldcapacity + (oldcapacity>>1);E[] newElements = (E[]) new Object[newcapacity];for (int i=0;i<size;i++){//循环队列获取第i个元素的下标的方式:newElements[i]=elements[(i+front)%elements.length];//这个扩容的方式就是把队列里的元素依次出队到另一个队列里,同时重置队头的位置}front = 0;elements = newElements;System.out.println("enLarge Success"+"  newCapacity = "+newcapacity);}}public int size(){return size;}public boolean isEmpty(){return size == 0;}//清空循环队列,涉及到元素的真实下标计算,同扩容那里public void clear(){for (int i = 0;i<size;i++){elements[(i+front)%elements.length]=null;}size = 0;front = 0;}//出队,主要注意对front的处理public E deQueueFront(){E element = elements[front];elements[front] = null;front = (front+1)%elements.length;size--;return element;}//从队尾出队public E deQueueNear(){E element = elements[realIndexCaculate(size-1)];elements[realIndexCaculate(size-1)] = null;size--;return element;}//从队头入队public void enQueueFront(E element){ifNeedEnLarge(size+1);elements[realIndexCaculate(-1)] = element;front = realIndexCaculate(-1);size++;}//入队,主要注意对入队位置的计算public void enQueueNear(E element){ifNeedEnLarge(size+1);elements[(front+size)% elements.length] = element;size++;}public String arrayPrint(){StringBuilder string = new StringBuilder();string.append("size = ").append(size).append(" ").append("front= ").append(elements[front]).append(" [");for (int i = 0; i< elements.length; i++ ){if (elements[i]==null){string.append("null,");}else {string.append(elements[i]).append(",");}}string.append("]");return string.toString();}
}

2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现相关推荐

  1. 2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码

    //循环队列,本质就是用动态数组实现的,且出队入队时间复杂度均O(1)的队列 //相比普通队列,增设一个front指针,代表队头,代表下一个出队的元素 //循环队列的重点在于队头队尾的元素的下标的计算 ...

  2. java实现线性表的案例_数据结构—线性表(LinearList)的原理以及Java实现案例

    线性表:零个或多个数据元素的有限序列.包括数组.链表.栈空间.队列等结构都属于线性表. 本文将介绍Java线性表中的数组.链表的实现逻辑,并附有数组线性表.单链表.静态链表的Java实现源码. 数据结 ...

  3. 数据结构-线性表(栈与队列的特殊性)

    通过前面的介绍我们知道,数据结构按照对应关系可以分为一对一的线性表结构.一 对多的树形结构,多对多的图形结构,以及同属一个集合的集合结构. 在此我们分析一下线性表结构: 对于线性表我们知道有数组.链表 ...

  4. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  5. 数据结构-线性表之用队列实现栈用栈实现队列

    文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...

  6. 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查

    03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...

  7. 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)

    [简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT  List { 数据 ...

  8. 数据结构——线性表(三)

    数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...

  9. 数据结构-线性表-思维导图+小结

    数据结构-线性表思维导图+小结 1 数据结构-第二章-线性表-思维导图 2 数据结构-第二章-线性表-习题小结 2.1 概念性习题小结 2.2 操作性习题小结 1 数据结构-第二章-线性表-思维导图 ...

最新文章

  1. Mapreduce编程1之WordCount
  2. 从扫描序列的标准化做起,西门子医疗正在中国布这样一盘棋...
  3. 5.SEH(结构化异常处理)
  4. 图论-欧拉图-欧拉回路-Euler-Fluery-Hierholzer-逐步插入回路法-DFS详解-并查集
  5. [笔试面试题] 8-面向对象篇
  6. python子图之间的距离_python与图论的桥梁——igraph
  7. 恢复到特定点(时间点、scn、日志序列号),rman不完全恢复
  8. 一步一步部署GlusterFS
  9. 如何才能让项目团队高效稳定?
  10. Python 递归函数计算阶乘
  11. 强烈推荐这款能探测别人工资的黑科技!秀的我头皮发麻
  12. 电脑开机加速,一下子就提升了20几秒
  13. 2021年电子竞赛四天三夜征程—-信号失真度测量装置(A题)
  14. Linux文件---文件锁
  15. rt-thread通过spi连接W25Q32后无法读取ID
  16. 在英特尔独立显卡上训练TensorFlow模型
  17. 2021-2025年中国工业锅炉行业市场供需与战略研究报告
  18. opencv_图像修复
  19. 建模常用的概念介绍1: WOE、IV
  20. 100PB!互联网史上最大规模数据迁移之一:115科技迁至阿里云

热门文章

  1. RTC_WaitForSynchro()
  2. 在机器学习分类中如何处理训练集中不平衡问题
  3. tessorflow实战
  4. ef mysql 时间_关于c#:EF6和MySQL时区支持
  5. C++ Primer 5th笔记(chap 11)关联容器
  6. 初等数论--同余--Fermat素性检测算法(为什么每次概率改变1/2)
  7. 01-密码学基础-前言
  8. [How TO]-如何编写Linux kernel documentation
  9. python with contextmanager yield 语法糖
  10. vulnhub_内网渗透测试的记录——网络安全