十一 队列 Queue
队列: 一种先进先出的数据结构 FIFO
数组队列的实现:
队列的实现:
package com.lt.datastructure.Queue; public class ArrayQueue<E> implements Queue<E> { private Array1<E> array; public ArrayQueue(int capacity){ array = new Array1<>(capacity); } public ArrayQueue(){ array = new Array1<>(); } @Override public int getSize() { return array.getSize(); } @Override public boolean isEmpty() { return array.isEmpty(); } @Override public void enqueue(E e) { array.addLast(e); } @Override public E dequeue() { return array.removeFirst(); } @Override //查看队首 public E getFront(E e) { return array.getFirst(); } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Queue:"); res.append("front:["); for(int i=0; i<array.getSize();i++){ res.append(array.get(i)); if(i!=array.getSize()-1){ res.append(","); } } res.append("] tail"); return res.toString(); } public static void main(String[] args) { ArrayQueue<Integer> queue = new ArrayQueue<>(); for(int i =0; i<10; i++){ queue.enqueue(i); System.out.println(queue); if(i%3==2){ queue.dequeue(); System.out.println(queue); } } } }
测试:
复杂度;
dequeue:出列操作时,移除队首,其余元素向前移一个位置 O(n)
循环队列:犹如钟表
- front指向队首,tail指向队尾
- 出队时,移动front的指向。
- font==tail时,队列为空
- (tail+1)%Capacity=front,队列满,会有一个元素浪费
循环队列复杂度分析:
循环队列的实现:
package com.lt.datastructure.Queue; import com.lt.datastructure.Array.Array; /* * 循环队列的实现 */ public class LoopQueue<E> implements Queue<E> { private int front,tail; private int size; E[] data; public LoopQueue(int capacity){ data = (E[])new Object[capacity+1]; front = 0; tail = 0; size = 0; } public LoopQueue(){ this(10); } //由于空出一个空间,所以容量-1 public int getCapacity() { return data.length-1; } @Override public boolean isEmpty() { return front==tail; } @Override public int getSize() { return size; } @Override public void enqueue(E e) { //队列满,扩容 if((tail+1) % data.length ==front){ resize(getCapacity()*2); } data[tail] = e; tail = (tail+1)%data.length; size++; } private void resize(int newCapacity) { E[] newData =(E[])new Object[newCapacity+1]; for(int i=0; i < size; i++){ newData[i] = data[(i+front)%data.length]; } data = newData; front = 0; tail=size; } @Override public E dequeue() { //查看的队列是否为空 if(isEmpty()){ throw new IllegalAccessError("cannot dequeue from an empty queue."); } E ret = data[front]; data[front] = null; front = (front+1)%data.length; size--; if(size==getCapacity()/4 && getCapacity()/2!=0){ resize(getCapacity()/2); } return ret; } @Override public E getFront(E e) { //查看的队列是否为空 if(isEmpty()){ throw new IllegalAccessError("cannot getFront from an empty queue."); } return data[front]; } @Override//覆盖父类方法 public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("LoopQueue:size = %d , capacity = %d\n",size,getCapacity())); res.append("front ["); for(int i = front; i!=tail ; i=(i+1)%data.length){ res.append(data[i]); if((i+1)%data.length != tail) res.append(","); } res.append("]"); return res.toString(); } public static void main(String[] args) { LoopQueue<Integer> queue = new LoopQueue<>(); for(int i =0; i<10; i++){ queue.enqueue(i); System.out.println(queue); if(i%3==2){ queue.dequeue(); System.out.println(queue); } } } }
测试用例:
package com.lt.datastructure.Queue; import java.util.Random; public class Main { /* * 测试ArrayQueue和LoopQueue */ private static double testQueue(Queue<Integer> q , int opCount){ long startTime = System.nanoTime(); //.. Random random = new Random(); for(int i =0; i<opCount;i++){ q.enqueue(random.nextInt(Integer.MAX_VALUE)); } for(int i=0; i<opCount; i++){ q.dequeue(); } long endTime = System.nanoTime(); return (endTime-startTime)/1000000000.0; } public static void main(String[] args){ int opCount = 100000; ArrayQueue<Integer> arrayQueue = new ArrayQueue<>(); System.out.println("ArrayQueue:"+testQueue(arrayQueue,opCount)); LoopQueue<Integer> loopQueue = new LoopQueue<>(); System.out.println("LoopQueue:"+testQueue(loopQueue, opCount)); } }
测试结果:
十一 队列 Queue的更多相关文章
- jQuery 源码分析(十一) 队列模块 Queue详解
队列是常用的数据结构之一,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).特点是先进先出,最先插入的元素最先被删除. 在jQuery内部,队列模块为动画模块提供基 ...
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- Java中的队列Queue,优先级队列PriorityQueue
队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...
- jquery 的队列queue
使用示列代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- Windows Azure Service Bus (2) 队列(Queue)入门
<Windows Azure Platform 系列文章目录> Service Bus 队列(Queue) Service Bus的Queue非常适合分布式应用.当使用Service Bu ...
- Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue
<Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...
- (C#)使用队列(Queue)解决简单的并发问题
(C#)使用队列(Queue)解决简单的并发问题 2015-07-16 13:04 13265人阅读 评论(8) 收藏 举报 分类: Asp.Net(8) 版权声明:本文为博主原创文章,未经博主允 ...
- STL中的单向队列queue
转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...
- java09 队列Queue与Deque
队列Queue与Deque. Enumeration Hashtable与Hashtable子类Properties(资源配置文件) 引用类型(强.软.弱.虚)与WeakHashMap Identit ...
随机推荐
- 洛谷 P3956 棋盘(记忆化搜索)
嗯... 题目链接:https://www.luogu.org/problem/P3956 这是一道比较好搜的题,注意一些剪枝.预处理和魔法的处理问题(回溯). AC代码: #include<c ...
- 工具 - 正则Cheat sheet
- Bugku-CTF加密篇之这不是摩斯密码(下载看看吧)
这不是摩斯密码 下载看看吧
- 【代码审计】VAuditDemo 重装漏洞
一.源码安装漏洞介绍 一般在PHP源码程序都有一个初始安装的功能,如果相关代码没有对参数进行严格过滤,可能会导致攻击者访问安装页面(install.php)或构造数据包,对网站进行重新安装,从而危害网 ...
- idea 创建maven子父工程
1.创建maven工程: 2. 创建工程名称: 3.删除父工程下的src文件夹,指定打包方式为pom,添加maven依赖: 4.右键项目添加子工程: 5.添加子工程名称: 6.子工程创建成功: 7.依 ...
- windows下如何快速删除大文件
rmdir 磁盘:\文件夹的名字 /s /q; eg:rmdir E:\vue_workspace\KB\day08 /s/q /S 表示除目录本身外,还将删除指定目录下的所有子目录和文件. ...
- 【转载】Eclipse 最常用快捷键 (动画讲解),最简单的一些快捷键
Eclipse有强大的编辑功能, 工欲善其事,必先利其器, 掌握Eclipse快捷键,可以大大提高工作效率. 小坦克我花了一整天时间, 精选了一些常用的快捷键操作,并且精心录制了动画, 让你一看就会. ...
- DC-DC芯片
KIS-3R33S:同步整流7V-24V转5V/3A DC-DC降压模块 稳压电源模块 效率超过LM2576
- Tomcat 配置目录及文件说明!
==================================================================================
- device supports x86 but apk only supports armeabi-v7a问题解决
我们可以在build.gradle中有ndk这段代码,只要在后面加上“x86”,再sync now一下,就发现可以运行了. ndk { abiFilters "armeabi-v7a&quo ...