天方夜谈·数据结构·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.使用时, ...
随机推荐
- IE浏览器下使用AJAX登陆接口请求缓存与登陆不了的问题解决
问题: 在IE浏览器下面,登陆的时候老是登陆不上,但是打开控制台的时候再登陆却能登陆上. 分析: 通过抓包,发现,在不打开控制台的时候,少了一个接口的请求,却返回了改接口的返回信息,但是返回信息并不是 ...
- 【转】Objective-C Runtime
之前在找Runtime资料,这篇条理是相对比较清晰,对我最有启发的一篇,转载以作记录. 对于iOS小白,值得多看几遍,会有不少收获. --------------------------------- ...
- 对VC++6.0爱得深沉(一)安装vc++6.0,支持winXP,win7,win8.1,win10
[欢迎入坑] 从这里起,我称VC++6.0为小c. 为什么我对小c爱得深沉? 虽然饱受非议,但是,我只想说,我太单纯,小c轻轻松松成功运行在各个win平台,对于我来说她:高速.小巧.便捷.听话.可定制 ...
- Android开发之音乐播放器
做了一天的音乐播放器小项目,已经上传到github,将链接发到这里供大家参阅提议 https://github.com/wangpeng0531/MusicPlayer.git
- javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象
对象字面量 JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...
- 服务器证书安装配置指南(SLB)
一.生成证书请求 1.下载CSR生成工具 您需要使用CSR生成工具来创建证书请求. 下载AutoCSR: http://www.itrus.cn/soft/autocsr.rar 2.生成服务器 ...
- [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:<> [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView) 在RecyclerV ...
- JavaWeb之HTTP协议
一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...
- 浓缩的才是精华:浅析GIF格式图片的存储和压缩
成文迪, 在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦. GIF格式的历史 GIF(Graphics Interchange Format)原义是"图像互换 ...
- Python多线程Selenium跨浏览器测试
前言 在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏 ...