Java数据结构(三)
——队列
队列(简称为队)也是一种特殊的线性表,队列的数据元素以及数据元素之间的操作与线性表完全相同,差别是线性表允许在任意位置插入和删除,而队列只允许在一端进行插入操作而在另一端进行删除操作。队列允许插入操作的一端称为队尾,允许进行删除操作的一端称为对头。队列的插入操作通常称为入队列,队列的删除操作通常称为出队列。
因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,因此队列也被称为先进先出表。比方说,大家在食堂排队买饭时,只有最早来排队的,即最先入队列的,才能最先买到饭,即最先出队列。
顺序队列
使用顺序存储结构的队列称为顺序队列。
如图所示,这是一个有4个存储空间的顺序队列的动态示意图,图中front表示队头,rear表示队尾,图(a)表示一个空队列,此时front=rear=0;图(b)表示数据元素A、B、C入队列后的状态。此时front=0,rear=3;图(c)表示A已经退出队列,此时front=1,rear=3;图(d)表示B、C都已经出队列,此时队列已空。但是front=rear=3。那么,假如我们一开始设置的队列长度仅为3个时,即maxSize=3,那么如果还有数据元素想要进入队列,顺序队列将因为越出数组下界而“溢出”。但实际上数组中还有3个位置可以存储,此时的“溢出”并是不是由于数组空间不够而产生的溢出。顺序队列因多次入队列和出队列的操作后出现的有存储空间但不能进行入队列操作的溢出称为假溢出。
假溢出是由于队尾rear的值和队头front的值不能由所定义数组下界值自动转为数组上届值而产生的。因此,解决该问题的方法是把顺序队列所使用的存储空间构造成一个逻辑上首尾相连的循环队列。当rear和front达到maxSize-1后,在加1就自动到0,这样就不会出现假溢出的问题,例如rear=(rear+1)%6。
不过顺序循环队列还存在一个问题,即当队列空时和队列满时,front=rear=0,即无法区分队列为空还是为满的状态,这样最好的解决无疑是设置一个计数器count,初始时设置count=0(队列空时为0),每入列一次count加一,每出列一次count就减一,因此,这样判断队列为空的条件为count==0,队列满的判断条件为count!=0&&front == rear。下面为具体实现代码:
package pzw.Queue; /** * 使用顺序存储结构实现的队列 * @author pzw * */ public class SeqQueue implements queue{ public final int defaultSize = 10;//默认构造队列的大小 public Object[] queue;//队列数组 public int top;//队列头部位置 public int end;//队列尾部位置 public int count;//队列中现有元素的个数 public int maxSize;//队列中最大元素的个数 //无参构造函数 public SeqQueue(){ initiate(defaultSize); } //构造函数 public SeqQueue(int size){ initiate(size); } //队列初始化 private void initiate(int size){ maxSize = size; queue = new Object[size]; top = 0; end = 0; count = 0; } public void insert(Object elm) throws Exception{ if(top == end&&count != 0){ throw new Exception("该队列已满,请先清空该队列"); } queue[end] = elm; end = (end + 1) % maxSize;//加一后求模,解决顺序存储结构假溢出 count++; } public Object delete() throws Exception{ if(top == end&&count == 0){ throw new Exception("该队列已空,请添加数据"); } top = (top + 1) % maxSize; count--; return queue[top]; } public Object getData() throws Exception{ if(top == end&&count == 0){ throw new Exception("该队列已空,请添加数据"); } return queue[top]; } public boolean notEmpty() { return count > 0; } }
链式队列
package pzw.Queue; /** * 队列的链式存储结构的实现 * @author pzw * */ public class LinQueue implements queue{ private Node top;//队列的头部 private Node end;//队列的尾部 private int count;//队列中元素的个数 //构造函数 public LinQueue(){ initiate(); } //初始化队列 private void initiate(){ top = null; end = null; count = 0; } public void insert(Object elm) throws Exception { Node newNode = new Node(elm,null); if(end != null){ end.next = newNode;//插入新结点 } end = newNode;//重置尾结点 if(top == null){ top = newNode; } count++; } public Object delete() throws Exception { if(count == 0){ throw new Exception("该队列已空,请添加数据"); } Node temp = top; top = top.next;//重置头结点 count--; return temp.elm; } public Object getData() throws Exception { if(count == 0){ throw new Exception("该队列已空,请添加数据"); } return top.elm; } public boolean notEmpty() { // TODO Auto-generated method stub return count != 0; } }
相关推荐
Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法
JavaJava 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java ...
"Java常见数据结构面试题(带答案)" 以下是对Java常见数据结构面试题的知识点总结: 栈和队列 * 栈和队列的共同特点是只允许在端点处插入和删除元素。 * 栈通常采用的两种存储结构是线性存储结构和链表存储结构...
java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题...
Java数据结构是计算机科学中的重要课程,主要探讨如何有效地存储和组织数据,以便进行高效的操作。这门课程通常包括数组、链表、栈、队列、树、图、哈希表等多种数据结构,并深入讲解它们的特性、操作方法以及在实际...
Java数据结构和算法.pdf
Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...
《Java数据结构全套》是针对Java编程语言深入学习数据结构的重要资源集合,涵盖了从基本概念到高级应用的全面知识体系。这个压缩包包含了四部分关键内容:叶核亚编著的《数据结构(Java版)(第3版)》电子教案、...
java 数据结构总结的思维导图笔记,个人做的非常全,需要的自行下载
"Java数据结构实例"这个主题,旨在通过具体的代码实例帮助初学者掌握数据结构的基本概念和使用方式,以此来提升编程思维和问题解决能力。在这个压缩包文件中,我们可以预期找到一些用Java实现的数据结构的源代码。 ...
Java数据结构和算法第三十一讲.avi Java数据结构和算法第三十七讲.avi Java数据结构和算法第三十三讲.avi Java数据结构和算法第三十九讲.avi Java数据结构和算法第三十二讲.avi Java数据结构和算法第三十五讲.avi ...
《邓俊辉版Java数据结构源码》是学习数据结构与算法的重要参考资料,它与邓俊辉教授编写的《Java数据结构》教材相配套,旨在帮助读者深入理解数据结构的概念和实现方法。邓俊辉教授的讲解风格清晰易懂,他的源码同样...
在这个名为“数据结构JAVA实现”的压缩包中,我们可以看到作者提供了三种重要的数据结构——链表、有序二叉树和队列的Java代码实现。 首先,让我们详细探讨链表。链表是一种线性数据结构,与数组不同,它不连续存储...
《数据结构(Java版本)》这本书正是为此目的而编写,旨在将理论与实际编程相结合,通过Java语言来实现各种经典的数据结构。 首先,书中的基础部分会介绍数据结构的基本概念,如数组、链表、栈和队列。数组是最基本...
《清华邓俊辉Java数据结构》是一门深入探讨数据结构及其在Java编程语言中实现的课程。这门课程由清华大学的邓俊辉教授主讲,旨在帮助学生掌握数据结构的基本概念,理解它们的工作原理,并能用Java语言进行实际操作。...
《Java数据结构(老外那版,翻译的)》是一本专门为Java程序员设计的数据结构教程,它以清晰易懂的方式介绍了各种重要的数据结构概念。这本书是初学者的优秀选择,特别是对于那些偏好Java语言,不熟悉C++的人来说,...
以上就是Java数据结构测试题中涉及的主要知识点,它们涵盖了数据结构、软件工程、面向对象编程和多线程等多个方面,这些都是Java开发者必备的基础知识。理解并掌握这些内容对于编写高效、安全的Java代码至关重要。
Java 数据结构 Applet演示是利用Java编程语言设计的交互式应用程序,主要目的是通过可视化的方式帮助学习者理解数据结构的基本概念和操作。Applet是Java的一种小型应用程序,可以在Web浏览器中运行,提供了一种便捷...
这份“JAVA数据结构实验报告”很可能涵盖了数据结构的基本概念、常见类型以及它们在Java中的实现。下面我们将深入探讨相关知识点。 一、数据结构基本概念 数据结构是指一组数据的存储结构,它可以是线性的,如数组...