"我在想Y的时候不能想X....."

什么叫做Queue(队列)?”队列是项的集合,对于每一项x和y,如果x在y之前离开对头,那么x一定在y之前进入队列——Sesh·Venugopal“。生活中最形象的一个例子是:排队服务。先来的人先排队先接受服务,这种方式也叫做FIFO(first-in,first-out)。也叫做变态版的”先下手为强“。

我们希望这个Queue类具有一些操作,能够更好的为我们服务嘛:

Class structures.linear.Queue

//构造器:创建一个新的空队列
        Queue(){}

        void enqueue(T item){}  //把指定项添加到这个队列的队尾
        T dequeue(){}     /*删除并返回这个队列的对头的项,如果队列为空的话,那就抛出NoSuchElementException */
        int size(){}     //返回这个队列的项数
        boolean isEmpty(){}    //判断这个队列是否为空队列
        int pisitionOf(T item){} //返回指定项在队列中的位置,若不存在则返回null
        void clear(){}   //删除这个队列的所有项,清空项
        void remove(T item){} //移除项中的item指定项
        void removeAll(T item){}  /*移除队列中所有的指定项,如果不存在,则抛出NoSucnElementException*/
        T first(){}  //返回队列的第一项,即队头。空队列则返回null
        T next(){} //返回队列的下一项,到达队尾则返回null

方法的运行时间,队列的基本操作就是在队列的头尾执行,因此一个高效实现将维护对队头队尾的直接引用,使这些位置可以一次执行,则时间复杂度为O(1),对于返回搜索项的位置,移除项其都要遍历整个队列,则为O(n)。

现在我们来模拟一下打印机的工作原理:

打印第一个文件——>打印完毕——>打印第二个文件········打印第n个文件——>打印结束

package printQueue;

public class fileJob {
     String file;
     int id;
     String owner;

     fileJob(String owner,int id,String file){
         this.file=file;
         this.owner=owner;
         this.id=id;
     }
     public String toString(){
         return new String(owner+"  "+id+"  "+file);
     }
     public boolean equals(Object other){
         if(other!=null&&other instanceof fileJob){
             fileJob another=(fileJob)other;
             return id==another.id;
         }
     return false;
     }
}
     //将打印的文件做成一个类,然后用这个类的实例化对象进行操作
package printQueue;

/*
这几个类继承fileJob类,主要是重写了比较方法,按照不用的比较参数,进行匹配
*/

public class ownerJob extends fileJob {

    ownerJob(String owner, int id, String file) {
        super(owner, id, file);
    }
    public boolean equals(Object other){
        if(other!=null&&other instanceof fileJob){
            fileJob another=(fileJob)other;
            return (owner.equals(another.owner));
        }
        return false;
    }
}
class idowner extends fileJob{

    idowner(String owner, int id, String file) {
        super(owner, id, file);
    }
    public boolean equals(Object other){
        if(other!=null&&other instanceof fileJob){
            fileJob another=(fileJob)other;
            return (id==another.id)&&(owner.equals(another.owner));
        }
        return false;
    }
}
package printQueue;

import java.util.*;
import java.io.*;
import structrues.linear.Queue;  //导入后面建立的类Queue类

public class printQueue{

   Queue<fileJob> printQ;
    public printQueue(){
        printQ=new Queue<fileJob>();
    }                                                     //实例化对象

    public void lqr(String owner,int id,String file){
        printQ.enqueue(new fileJob(owner,id,file));
    }
                                                          //添加入队列
    public void lpq(){
        fileJob job=printQ.first();
        while(job!=null){
            System.out.println(job);
            job=printQ.next();
        }
    }                                                //遍历输入队列中所有的项

   //下面几个就是对队列进行出队列和删除队列中的项的操作

    public void lprm(String owner,int idjob){
        if(printQ.isEmpty()){
            throw new NoSuchElementException();
        }
        //删除所有与id相同的项
        printQ.remove(new idowner(owner,idjob,null));
    }
    public void lprm(String owner){
        if(printQ.isEmpty()){
            throw new NoSuchElementException();
        }
        fileJob job = printQ.first();
        if(owner.equals(job.owner)){
            printQ.dequeue();
        }
        else{
            throw new NoSuchElementException();
        }
    }
    public void lprmAll(String owner){
        if(printQ.isEmpty()){
            throw new NoSuchElementException();
        }
        printQ.removeAll(new ownerJob(owner,0,null));
    }
}
package structrues.linear;

import java.util.Collection;
import java.util.LinkedList;
import java.util.NoSuchElementException;

import printQueue.fileJob;

/*类Queue的实现,主要是用了一个LinkedList类,ListedList类的具体实现设计到底层的算法
*/

public class Queue<T> {
     LinkedList<T> list;
     int cursor;

    public Queue(){
        list=new LinkedList<T>();
        cursor=-1;
    }
    public void enqueue(T item){
        list.add(item);
    }  //把指定项添加到这个队列的队尾
    public T dequeue(){
        if(list.isEmpty()){
            throw new NoSuchElementException();
        }
        return list.remove(0);

    }     /*删除并返回这个队列的对头的项,如果队列为空的话,那就抛出NoSuchElementException */
   public int size(){
        return list.size();
    }     //返回这个队列的项数
    public boolean isEmpty(){
        return list.isEmpty();
    }    //判断这个队列是否为空队列
    public int pisitionOf(T item){
        return list.indexOf(item);
    } //返回指定项在队列中的位置,若不存在则返回null
    public void clear(){
        list.clear();
    }   //删除这个队列的所有项,清空项
    public void remove(T item){
        list.remove(item);
    } //移除项中的item指定项
    public void removeAll(T item){
        list.removeAll((Collection<?>) item);
    }  /*移除队列中所有的指定项,如果不存在,则抛出NoSucnElementException*/
    public T first(){
      if(list.size() == 0){return null;}
      cursor = 0;
      return list.get(cursor);
    }  //返回队列的第一项,即队头。空队列则返回null
    public T next(){
        if(list.size() == 0 || cursor == (list.size()-1)){
            return null;
        }
        cursor++;
        return list.get(cursor);
    } //返回队列的下一项,到达队尾则返回null
}

到了最后,完成测试类:

package printQueue;
public class mainText {

    public static void main(String[] args) {
       printQueue pq=new printQueue();
       pq.lqr("小二",001,"第一个文件");
       pq.lqr("张三",002,"第二个文件");
       pq.lqr("李四",003,"第三个文件");
       pq.lqr("王二麻子",004,"第四个文件");
       pq.lqr("老王",005,"第五个文件");
       System.out.println("运行出来的结果还是蛮不错的嘛");
       System.out.println("需要打印的文件已经按照好顺序准备打印");
       System.out.println();
       pq.lpq();
    }
}

实际运行效果

真的,对于才开始解除java,一开始理解这样的编程过程肯定是有点难的。实际上对类成员的操作一直是java这类面向对象编程的特点。真正理解类才发现写代码“累”

天方夜谈·数据结构·Queue的更多相关文章

  1. 天方夜谈·数据结构·List

    在战场上杀不死的敌人,永远也别想打败他,他就像幽灵横亘在你失败的田地上. 大一下学期,接触到Java程序设计语言,时至今日,才越发觉得知识与技术的海洋是多么多么的浩瀚.......如果说编程语言的一个 ...

  2. 夜谈Java类的定义

    女孩:谈Java了,好耶? 男孩:夜谈一下,Java的类的定义~ 女孩:那谈Java的类的什么呢? 男孩:类的定义,对象的定义,类中的方法,构造方法,this关键字,方法的重载,Java中的类的访问权 ...

  3. 你云我云•兄弟夜谈会 第三季 企业IT架构

    你云我云•兄弟夜谈会 第三季 企业IT架构 你云我云•兄弟夜谈会 第二季 5G 你云我云•兄弟夜谈会 第一季 企业云 0. 概况 时间:2019年2月23日 22:00~23:30 主题:企业IT架构 ...

  4. [转帖]你云我云•兄弟夜谈会 第三季 企业IT架构

    你云我云•兄弟夜谈会 第三季 企业IT架构 https://www.cnblogs.com/sammyliu/p/10425252.html 你云我云•兄弟夜谈会 第三季 企业IT架构 你云我云•兄弟 ...

  5. Java学习笔记——浅谈数据结构与Java集合框架(第二篇、Queue、Set)

    江南好,何处异京华. 香散翠帘多在水,绿残红叶胜于花.无事避风沙. --<纳兰词> 诗词再好,大图不能忘 上大图: 先说说栈和队列: 栈就好比手枪的弹匣,你往里面压入子弹,最先压入的子弹就 ...

  6. linkin大话数据结构--Queue

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...

  7. ECharts图表中级入门之formatter:夜谈关于ECharts图表内的数据格式化方法

    来源于:http://www.ithao123.cn/content-3751220.html 格式化之所以存在,主要是因为我们想把一些不够人性化的内容通过某种处理让其变得人性化,便于用户更好地理解内 ...

  8. Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)

    横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. --苏轼 这一块儿学的是云里雾里,咱们先从简单的入手.逐渐的拨开迷雾见太阳.本次先做List集合的三个实现类的学习笔记 List特点: ...

  9. 浅谈数据结构vector

    vector: 又名 向量 1.C++中的一种数据结构. 2.是一个类. 3.相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. A.使用时, ...

随机推荐

  1. 使用spring webflow,在前台页面中如何显示后端返回的错误信息

    刚刚接触spring webflow,相关的资料并不是很多,并且大都是那种入门的 .xml文件的配置. 用到的CAS 最新的4.0版本用的就是web-flow流,前台页面使用的是表单提交.于是我就碰到 ...

  2. Linux块设备驱动(二) _MTD驱动及其用户空间编程

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  3. UWP Composition API - New FlexGrid 锁定行列

    如果之前看了 UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包 这篇的童鞋,针对VS2017,需要对应更新一下配置,需要的童鞋点 ...

  4. CSS.02 -- 样式表 及标签分类(块、行、行内块元素)、CSS三大特性、背景属性

    样式表书写位置  内嵌式写法 <head> <style type="text/css"> 样式表写法 </style> </head&g ...

  5. 关于Android开发的几点建议

    绝不要在UI线程中做数据处理的工作,这会让你的app变慢,带来极差的用户体验. 要按照google发布的Design指导意见来设计app,比如一个holo主题app会给用户带来更好的用户体验. 不要复 ...

  6. java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解

    public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...

  7. 常见【十种】WEB攻击及防御技术总结

    最近参加了一个WEB安全培训,感觉WEB攻击跟防御都是挺有意思的.以下总结比较简短,仅供观赏哈. 一.XSS攻击 [介绍] xss攻击是跨站脚本攻击,例如在表单中提交含有可执行的javascript的 ...

  8. Nagios监控远程主机

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; line-height: 150%; fon ...

  9. Windows下检测文件名大小写是否匹配

    跨平台开发有一个众所周知,但因为只是偶尔受到困扰,一般人不会在意的问题,就是windows对文件名大小写不敏感,而其他平台对文件名大小写敏感.因此可能出现在windows平台开发时一切正常,但部署/打 ...

  10. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...