天方夜谈·数据结构·Queue
"我在想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的更多相关文章
- 天方夜谈·数据结构·List
在战场上杀不死的敌人,永远也别想打败他,他就像幽灵横亘在你失败的田地上. 大一下学期,接触到Java程序设计语言,时至今日,才越发觉得知识与技术的海洋是多么多么的浩瀚.......如果说编程语言的一个 ...
- 夜谈Java类的定义
女孩:谈Java了,好耶? 男孩:夜谈一下,Java的类的定义~ 女孩:那谈Java的类的什么呢? 男孩:类的定义,对象的定义,类中的方法,构造方法,this关键字,方法的重载,Java中的类的访问权 ...
- 你云我云•兄弟夜谈会 第三季 企业IT架构
你云我云•兄弟夜谈会 第三季 企业IT架构 你云我云•兄弟夜谈会 第二季 5G 你云我云•兄弟夜谈会 第一季 企业云 0. 概况 时间:2019年2月23日 22:00~23:30 主题:企业IT架构 ...
- [转帖]你云我云•兄弟夜谈会 第三季 企业IT架构
你云我云•兄弟夜谈会 第三季 企业IT架构 https://www.cnblogs.com/sammyliu/p/10425252.html 你云我云•兄弟夜谈会 第三季 企业IT架构 你云我云•兄弟 ...
- Java学习笔记——浅谈数据结构与Java集合框架(第二篇、Queue、Set)
江南好,何处异京华. 香散翠帘多在水,绿残红叶胜于花.无事避风沙. --<纳兰词> 诗词再好,大图不能忘 上大图: 先说说栈和队列: 栈就好比手枪的弹匣,你往里面压入子弹,最先压入的子弹就 ...
- linkin大话数据结构--Queue
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...
- ECharts图表中级入门之formatter:夜谈关于ECharts图表内的数据格式化方法
来源于:http://www.ithao123.cn/content-3751220.html 格式化之所以存在,主要是因为我们想把一些不够人性化的内容通过某种处理让其变得人性化,便于用户更好地理解内 ...
- Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)
横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. --苏轼 这一块儿学的是云里雾里,咱们先从简单的入手.逐渐的拨开迷雾见太阳.本次先做List集合的三个实现类的学习笔记 List特点: ...
- 浅谈数据结构vector
vector: 又名 向量 1.C++中的一种数据结构. 2.是一个类. 3.相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. A.使用时, ...
随机推荐
- 原生ajax详解
Ajxa局部刷新用于提高用户体验.Ajax技术的核心是XMLHttpRequest对象(简称XHR) XMLHttpRequest对象 XMLHttpRequest对象在ie7及更高版本可以这样申明. ...
- 腾讯QQ会员技术团队:人人都可以做深度学习应用:入门篇(下)
四.经典入门demo:识别手写数字(MNIST) 常规的编程入门有"Hello world"程序,而深度学习的入门程序则是MNIST,一个识别28*28像素的图片中的手写数字的程序 ...
- 两个 Long 类型为什么不能直接用==比较
这要说到==和 equals 的区别了. 1. ==比较的是两个对象在内存中的地址值(栈中的内容). 2.equals 是 java.lang.Object 类的一个方法.equals 比较的是两个对 ...
- 二级C考点汇总
1.变量命名的合法性2.数据类型的转换,分为强类型和隐式类型3.字符串:字符串的声明.定义和使用,通常结合数组和指针 4.数组:下标的转换及数组的顺序存储5.函数:声明.定义.调用,递归函数(如菲薄纳 ...
- Telnet 在win7 和 xp中的使用
telnet 默认在开启之后 监听23端口.最近在尝试使用这个服务 虽然很多机器默认是不开启telnet这个服务的 但是 万一能够碰到 也是为了自己以后能够熟练起来咯. telnet有服务器跟客户端之 ...
- SpringMVC中@RequestBody引起的400异常处理,返回校验失败具体信息
问题 使用@RequestBody接收一个json数据的时候,如果传入的参数不符合条件,就会直接返回400的error page. 但究竟是为什么会400并没有抛出来.这对大量参数字段的我们来说,排错 ...
- python的try方法中的else和finally的区别
#coding=utf-8__author__ = '14356_000'try: print '1'except: print '2'else: print '3'finally: print '4 ...
- 牛顿迭代法求开根号。 a^1/2_______Xn+1=1/2*(Xn+a/Xn)
#include <stdio.h>#include <math.h>int main(void){ double a,x1=1.0,x2; printf("plea ...
- Python全栈开发第14天
字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Interc ...
- 如何把phpStorm打造成自己的专属IDE
1.如何设置phpStorm的默认编码,例如UTF-8?phpStorm的编码分为IDE Encoding 和Project Encoding,设置方法是打开File->Setting-> ...