队列:  一种先进先出的数据结构  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的更多相关文章

  1. jQuery 源码分析(十一) 队列模块 Queue详解

    队列是常用的数据结构之一,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).特点是先进先出,最先插入的元素最先被删除. 在jQuery内部,队列模块为动画模块提供基 ...

  2. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  3. Java中的队列Queue,优先级队列PriorityQueue

    队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...

  4. jquery 的队列queue

    使用示列代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  5. Windows Azure Service Bus (2) 队列(Queue)入门

    <Windows Azure Platform 系列文章目录> Service Bus 队列(Queue) Service Bus的Queue非常适合分布式应用.当使用Service Bu ...

  6. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue

    <Windows Azure Platform 系列文章目录> 在之前的Azure Service Bus中,我们已经介绍了Service Bus 队列(Queue)的基本概念. 在本章中 ...

  7. (C#)使用队列(Queue)解决简单的并发问题

    (C#)使用队列(Queue)解决简单的并发问题 2015-07-16 13:04 13265人阅读 评论(8) 收藏 举报  分类: Asp.Net(8)  版权声明:本文为博主原创文章,未经博主允 ...

  8. STL中的单向队列queue

    转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...

  9. java09 队列Queue与Deque

    队列Queue与Deque. Enumeration Hashtable与Hashtable子类Properties(资源配置文件) 引用类型(强.软.弱.虚)与WeakHashMap Identit ...

随机推荐

  1. SQL表名,应该用表对应资源对象的复数形式还是单数形式

    原文:http://blog.csdn.net/lizeyang 问题 SQL表名,应该用表对应资源对象的复数形式还是单数形式.例如一个用户表,表名是用user还是users更合适呢?   精华回答 ...

  2. mcast_set_ttl函数

    #include <errno.h> #include <net/if.h> #include <sys/socket.h> #include <netine ...

  3. 【嵌入式】ARM9复习

    一.嵌入式系统基础 二.ARM处理器 1. 在每条指令后,用;//注释这条指令的寻址方式,以及实现的功能(25分) 注:变址寻址需要标注是基址加偏移.还是基址加索引,是前变址还是后变址.SUB SP, ...

  4. Django中url name

    花了好长时间才明白这个name参数的含义.便写下来了备忘 当我们在url的时候,一般情况下都是使用很明确的url地址.如在网页里面使用<a href="/login"> ...

  5. Java后台技术(TDDL)

    从PC客户端开发转项目经理已经有一段时间了,感觉还不错,平安这边的项目经理还需要对外,所以部门其他项目经理经常需要出差去见客户,我专门对内,部门所有的开发和测试每天做什么.接下来做什么我都必须了解,部 ...

  6. linux下的apache服务自启动的几种方式

    1,如果是安装包安装在Linux系统下,那么可以使用 [root@localhost ~]# service httpd restart 从而可以开启或者重启apache服务 与此同时,它的标准方式是 ...

  7. vultr安装kali

    前言 很多国内的主机不支持自定义安装系统,且也不方便下载国外资料:),所以需要使用vultr安装kali. 1.上传镜像 镜像地址填这个(我当时的最新版本) https://cdimage.kali. ...

  8. 安装完 Ubuntu 16.04.1,重启出现[sda] Assuming drive cache: write through的问题

    重装了一下ubuntu,安装成功后重启出现了这个问题 刚开始以为是重启慢,就没在意这么多,可是我等了半个小时,(我特么的真闲,其实是忙别的忘了),还不行,咦,然后我就去找了找问题,哈哈哈哈 看图说话, ...

  9. Nexus 3048的NX-OS升级方法

    1.System Software和Kick Start 与普通IOS设备不同,NX OS升级时,共有2个文件需要升级.安装,如果只安装其中一个,可能会导致设备重启后无法进入系统.这2个文件包括: N ...

  10. mDNS故障排查(译)

    WLC上mDNS网关的理解及排查 第一部分:介绍 这篇文档描述了Bonjour协议在WLC上的操作,该文档旨在协助工程师理解该工作流量的原理以及提供故障排查的指导. 第二部分:需求和前提 知识需求: ...