2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现
//循环双端队列: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实现相关推荐
- 2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码
//循环队列,本质就是用动态数组实现的,且出队入队时间复杂度均O(1)的队列 //相比普通队列,增设一个front指针,代表队头,代表下一个出队的元素 //循环队列的重点在于队头队尾的元素的下标的计算 ...
- java实现线性表的案例_数据结构—线性表(LinearList)的原理以及Java实现案例
线性表:零个或多个数据元素的有限序列.包括数组.链表.栈空间.队列等结构都属于线性表. 本文将介绍Java线性表中的数组.链表的实现逻辑,并附有数组线性表.单链表.静态链表的Java实现源码. 数据结 ...
- 数据结构-线性表(栈与队列的特殊性)
通过前面的介绍我们知道,数据结构按照对应关系可以分为一对一的线性表结构.一 对多的树形结构,多对多的图形结构,以及同属一个集合的集合结构. 在此我们分析一下线性表结构: 对于线性表我们知道有数组.链表 ...
- Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。
数据结构与算法入门 问题1:为什么要学习数据结构 如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...
- 数据结构-线性表之用队列实现栈用栈实现队列
文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...
- 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查
03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...
- 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)
[简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT List { 数据 ...
- 数据结构——线性表(三)
数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...
- 数据结构-线性表-思维导图+小结
数据结构-线性表思维导图+小结 1 数据结构-第二章-线性表-思维导图 2 数据结构-第二章-线性表-习题小结 2.1 概念性习题小结 2.2 操作性习题小结 1 数据结构-第二章-线性表-思维导图 ...
最新文章
- Mapreduce编程1之WordCount
- 从扫描序列的标准化做起,西门子医疗正在中国布这样一盘棋...
- 5.SEH(结构化异常处理)
- 图论-欧拉图-欧拉回路-Euler-Fluery-Hierholzer-逐步插入回路法-DFS详解-并查集
- [笔试面试题] 8-面向对象篇
- python子图之间的距离_python与图论的桥梁——igraph
- 恢复到特定点(时间点、scn、日志序列号),rman不完全恢复
- 一步一步部署GlusterFS
- 如何才能让项目团队高效稳定?
- Python 递归函数计算阶乘
- 强烈推荐这款能探测别人工资的黑科技!秀的我头皮发麻
- 电脑开机加速,一下子就提升了20几秒
- 2021年电子竞赛四天三夜征程—-信号失真度测量装置(A题)
- Linux文件---文件锁
- rt-thread通过spi连接W25Q32后无法读取ID
- 在英特尔独立显卡上训练TensorFlow模型
- 2021-2025年中国工业锅炉行业市场供需与战略研究报告
- opencv_图像修复
- 建模常用的概念介绍1: WOE、IV
- 100PB!互联网史上最大规模数据迁移之一:115科技迁至阿里云
热门文章
- RTC_WaitForSynchro()
- 在机器学习分类中如何处理训练集中不平衡问题
- tessorflow实战
- ef mysql 时间_关于c#:EF6和MySQL时区支持
- C++ Primer 5th笔记(chap 11)关联容器
- 初等数论--同余--Fermat素性检测算法(为什么每次概率改变1/2)
- 01-密码学基础-前言
- [How TO]-如何编写Linux kernel documentation
- python with contextmanager yield 语法糖
- vulnhub_内网渗透测试的记录——网络安全