深感学习一个知识点,不能囫囵吞枣。
首先得对一个概念有正确(开始不一定正确,但至少得头脑清晰)的认知,再尝试按照自己的理解去练习写代码,这样才能真的学到东西。
队列是一种特殊的线性表,特殊之处在于限制了存取点,意思就是插入操作在队头进行,删除操作在队尾进行,分别称之为入队、出队。
由于插入和删除操作分别在队尾和队头进行,最先入队的元素总是最先出队,因此队列也称为先进先出(First In First Out)表。
以下是从顺序队列到顺序循环队列的代码展示:
/** * 顺序队列 * 当队列为空时,设置队头、队尾下标为0 * @author Administrator * */ public class SeqQueue1 { private Object value[]; private int front,rear,size; public SeqQueue1(int capacity){ this.value=new Object[Math.abs(capacity)]; this.front=this.rear=0; } public SeqQueue1(){ this(1); } //判断是否队空,若空返回true public boolean isEmpty(){ return this.size==0; } //判段队列是否已满,若满返回true public boolean isFull(){ return this.size==this.value.length; } //在队尾添加元素 public void enQueue(Object obj){ if(isFull()){ Object temp[]=new Object[this.value.length+1]; for(int i=0;i<this.value.length;i++){ temp[i]=this.value[i]; } this.value=temp; temp=null; } this.rear=(this.front+this.size)%this.value.length; // this.rear++; this.value[rear]=obj; this.size++; } //队头元素出列 public Object deQueue(){ if(isEmpty()) throw new RuntimeException("队列为空!"); Object obj=this.value[this.front]; this.front=(this.front+1)%this.value.length; // this.front++; this.size--; return obj; } //返回队列中元素个数 public int size(){ return this.size; } }
/** * 测试类 * @author Administrator * */ public class StuTest1 { private String name; private int score; public String getName() { return name; } public int getScore() { return score; } public StuTest1(String name,int score){ this.name=name; this.score=score; } public static void main(String[] args) { SeqQueue1 seq1=new SeqQueue1(); StuTest1 st1=new StuTest1("张三",4); StuTest1 st2=new StuTest1("李四",5); StuTest1 st3=new StuTest1("王五",6); StuTest1 st4=new StuTest1("赵六",7); seq1.enQueue(st1); seq1.enQueue(st2); seq1.enQueue(st3); seq1.enQueue(st4); System.out.println(seq1.size()); //循环里不能直接用i<seq.size(),因为每出来一个元素,seq.size()值减1 int num=seq1.size(); for(int i=0;i<num;i++){ StuTest1 st=(StuTest1)seq1.deQueue(); System.out.println("姓名为:"+st.getName()+",学分为:"+st.getScore()); } } }
顺序队列缺点分析:
(1)存在数组下标假溢出,就是队列可能没满,但是却不能再往里面添加元素
(2)一次入队/出队操作可能需要同时改变两个下标
为了克服以上不足,可以将顺序队列构造成一个逻辑上首尾相连的循环队列。
/** * 顺序循环队列 * @author Administrator * */ public class SeqQueue2 { private Object value[]; private int size,front,rear; //构造指定容量的空队列 public SeqQueue2(int capacity){ this.value=new Object[Math.abs(capacity)]; this.front=this.rear=0; } //构造默认容量的空队列 public SeqQueue2(){ this(1); } //判断队列是否为空,若空返回true public boolean isEmpty(){ return this.front==this.rear; } //在队尾添加元素 public boolean enQueue(Object obj){ if(this.front==(this.rear+1)%this.value.length){ Object temp[]=this.value; this.value=new Object[temp.length+1]; int i=this.front,j=0; while(i!=this.rear){ this.value[j]=temp[j]; i=(i+1)%temp.length; j++; } this.front=0; this.rear=j; } this.value[this.rear]=obj; this.rear=(this.rear+1)%this.value.length; this.size++; return true; } //队头元素出队 public Object deQueue(){ if(isEmpty()) throw new RuntimeException("队列已空!"); else{ Object obj=this.value[this.front]; this.front=(this.front+1)%this.value.length; this.size--; return obj; } } //返回队中元素个数 public int size(){ return this.size; } }
/** * 测试类 * @author Administrator * */ public class StuTest2 { private String name; private int score; public String getName() { return name; } public int getScore() { return score; } public StuTest2(String name,int score){ this.name=name; this.score=score; } public static void main(String[] args) { SeqQueue2 seq2=new SeqQueue2(); StuTest2 st1=new StuTest2("张三",4); StuTest2 st2=new StuTest2("李四",5); StuTest2 st3=new StuTest2("王五",6); StuTest2 st4=new StuTest2("赵六",7); seq2.enQueue(st1); seq2.enQueue(st2); seq2.enQueue(st3); seq2.enQueue(st4); //循环里不能直接用i<seq.size(),因为每出来一个元素,seq.size()值减1 int num=seq2.size(); for(int i=0;i<num;i++){ StuTest2 st=(StuTest2)seq2.deQueue(); System.out.println("姓名为:"+st.getName()+",学分为:"+st.getScore()); } } }
相关推荐
用java实现的四种磁盘调度算法:fcfs sstf scan cscan 。 可以随机生产磁道号,也可以自己指定。然后用表格的形式呈现出四种算法的磁道访问序列。欢迎下载。
掌握顺序循环队列的表示与实现。 3、实验内容: 设有N个人站成一排,从左到右的编号分别为1——N,现在从左往右报数“1,2,3,1,2,3。。。”,数到1的人出列,数到2和3的人立即站到队伍的最右端。报数过程反复...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...
(3) 把5个进程按顺序排成循环队列,用指针指出队列连接情况。用一个标志单元记录轮到运行的进程。处理器调度总是选择标志单元指示的进程运行,对所指的进程,将其“已运行时间”加1。 (4) 进程运行一次后,若“要求...
Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释...
中文名: 数据结构与算法分析_Java语言描述(第2版)作者: 韦斯译者: 冯舜玺资源格式: PDF版本: 扫描版出版社: 机械工业出版社书号: ISBN:9787111231837发行时间: 2009年01月01日地区: 大陆语言: 简体中文简介: 内容...
目录译者序前言第1章 引论1.1 本书讨论的内容1.2 数学知识复习1.2.1 指数1.2.2 对数1.2.3 级数1.2.4 模运算1.2.5 证明的方法1.3 递归简论1.4 实现泛型特性构件pre-Java51.4.1 使用Object表示泛型1.4.2 基本...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...
中文名: 数据结构与算法分析_Java语言描述(第2版)作者: 韦斯译者: 冯舜玺图书分类: 软件资源格式: PDF版本: 扫描版出版社: 机械工业出版社书号: ISBN:9787111231837发行时间: 2009年01月01日地区: 大陆语言: 简体...
中文名: 数据结构与算法分析_Java语言描述(第2版) 作者: 韦斯 译者: 冯舜玺 图书分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 机械工业出版社 书号: ISBN:9787111231837 发行时间: 2009年01月01日 地区: 大陆 ...
动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...
6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 6.6.1 左式堆性质 6.6.2 左式堆操作 6.7 斜堆 6.8 二项队列 6.8.1 二项队列结构 6.8.2 二项队列操作 6.8.3 二项队列的实现 6.9 标准库中的优先队列 小...
6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 6.6.1 左式堆性质 6.6.2 左式堆操作 6.7 斜堆 6.8 二项队列 6.8.1 二项队列结构 6.8.2 二项队列操作 6.8.3 二项队列的实现 6.9 标准库中的优先队列 小...
leetcode 推前保持清醒 这个 repo 致力于让我们对编程问题保持清醒。 这些将包括许多编程概念,例如字符串操作、循环、递归和数据结构。...pop()——从队列前面移除元素。 peek() -- 获取最前面的元素。 empty() -- 返
第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...
1.项目代码均经过功能验证ok,确保稳定可靠运行。...解决从Kafka中消费数据时的漏消费、重复消费以及读取数据时的顺序问题。 publisher-realtime——数据可视化模块 sparkStreaming-realtime——实时计算模块