十一 队列 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 ...
随机推荐
- 微信HTTP公告
- 将.NET Core Web Api发布到Linux(CentOS 7 64)
将.NET Core(2.1) Web Api发布到Linux(CentOS 7 64) 近来在学习linux相关的一些东西,然后正巧想试一下把core的应用程序发布到Linux,毕竟跨平台.尝试一下 ...
- C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,
//根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...
- C语言:求n(n<10000)以内的所有四叶玫瑰数。-将字符串s1和s2合并形成新的字符串s3,先取出1的第一个字符放入3,再取出2的第一个字符放入3,
//函数fun功能:求n(n<10000)以内的所有四叶玫瑰数并逐个存放到result所指数组中,个数作为返回值.如果一个4位整数等于其各个位数字的4次方之和,则称该数为函数返回值. #incl ...
- 「CF815C」Karen and Supermarket
传送门 Luogu 解题思路 树形背包. 设 \(f[i][j][0/1]\) 表示在以 \(i\) 为根的子树中选 \(j\) 件商品的最少花费. 边界条件: \(f[i][j][0] = \min ...
- Elasticsearch系列---初识mapping
概要 本篇简单介绍一下field数据类型mapping的相关知识. mapping是什么? 前面几篇的实战案例,我们向Elasticsearch索引数据时,只是简单地把JSON文本放在请求体里,至于J ...
- PyQt5设置图片格式及动画
1.缩放图片'''使用QImage.Scale(width,height)方法可以来设置图片'''from PyQt5.QtCore import *from PyQt5.QtGui import * ...
- Update(Stage4):sparksql:第3节 Dataset (DataFrame) 的基础操作 & 第4节 SparkSQL_聚合操作_连接操作
8. Dataset (DataFrame) 的基础操作 8.1. 有类型操作 8.2. 无类型转换 8.5. Column 对象 9. 缺失值处理 10. 聚合 11. 连接 8. Dataset ...
- 洛谷 P2925 [USACO08DEC]干草出售Hay For Sale
嗯... 题目链接:https://www.luogu.org/problemnew/show/P2925 这是一道简单的01背包问题,但是按照正常的01背包来做会TLE一个点,所以要加一个特判(见代 ...
- JavaScript判断两个对象内容是否相等
ES6中有一个方法判断两个对象是否相等,这个方法判断是两个对象引用地址是否一致 let obj1= { a: 1 } let obj2 = { a: 1 } console.log(Object.is ...