深感学习一个知识点,不能囫囵吞枣。
首先得对一个概念有正确(开始不一定正确,但至少得头脑清晰)的认知,再尝试按照自己的理解去练习写代码,这样才能真的学到东西。
队列是一种特殊的线性表,特殊之处在于限制了存取点,意思就是插入操作在队头进行,删除操作在队尾进行,分别称之为入队、出队。
由于插入和删除操作分别在队尾和队头进行,最先入队的元素总是最先出队,因此队列也称为先进先出(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语言已经提供了多种内置的数据结构,如数组、链表、栈、队列等,供开发者直接使用。 #### 2. JVM内存结构 Java虚拟机(JVM)的内存结构主要包括三个部分: - **栈内存**:用于存储局部变量和方法调用信息。当...
1. 先到先服务(FCFS,First-Come, First-Served)算法是最简单的调度策略,按照进程到达的顺序来决定执行顺序。这种算法公平且易于实现,但可能导致短进程长时间等待,降低了系统的响应速度。 2. 短作业优先(SJF...
本文将基于《Java数据结构和算法》学习笔记中的“栈和队列”部分进行深入探讨。 栈(Stack)是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。在栈中,元素的添加(压栈)和移除(弹栈)都是在...
当队列中没有元素时,我们称之为空队列。 在Java中,我们可以使用数组来模拟队列。以下是一个简单的Java实现: ```java // 使用数组模拟队列 class ArrayQueue { private int maxSize; private int front; ...
熟悉数组、链表、堆栈、队列、哈希表和二叉树等基本数据结构,以及排序算法(如插入、冒泡、快速、堆、合并排序)和查找算法(如顺序、二分查找)。同时,理解算法的时间和空间复杂度分析,以及递推、递归、穷举、...
当CPU快速生成数据时,这些数据会被存储到队列中,等待较慢的外部设备(如显示器)按顺序处理。通过这种方式,可以避免CPU因等待外部设备而空闲,提高系统的整体效率。 设计缓冲队列时,需要考虑以下几个关键点: ...
实验总结表明,通过这个实验,学习者不仅掌握了如何用Java实现队列的算法,还在实践中解决了之前遇到的问题。队列作为一种基础数据结构,在很多实际问题中都有应用,如任务调度、多线程同步等,因此理解其工作原理和...
【Java编程实现拼图游戏】 在信息技术领域,Java是一种广泛使用的高级编程语言,以其“一次编写,到处运行”的特性而闻名。在这个项目中,我们利用Java...这是一个良好的学习平台,能够帮助提升对Java编程的综合理解。
通过深入学习以上知识点,并结合"java网络编程--qq聊天程序"的项目实践,你将能够构建自己的网络聊天应用程序,理解JAVA WEB编程的核心技术和QQ聊天程序的实现原理。同时,不断研究和实践新技术,提升你的编程能力和...
在"Part03Queue"这个压缩包中,可能包含了关于如何在Java中实现环形队列的代码示例,通过学习这部分内容,你可以深入了解环形队列的内部机制,并能熟练地在自己的项目中运用。此外,"bearqu5"可能是一个开发者的名字...
FCFS是最简单的磁盘调度策略,按照磁道请求的顺序进行服务。每个请求都需要等待读写头完成当前请求后才能开始处理,可能会导致平均寻道时间较长,但算法简单且公平。 2. 最短寻道时间优先(SSTF)算法: SSTF算法...
在编程领域,数据结构和算法是核心技术之一,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,对数据结构和算法的支持尤为关键。本文将深入探讨链表这一重要的线性数据结构,并通过源码分析来理解其...
《数据结构与算法分析——Java语言描述》是一本深度探讨数据结构和算法的权威书籍,专为Java程序员设计。本书旨在帮助读者理解如何在实际编程中有效地使用数据结构和算法,提升程序性能和解决问题的能力。书中的内容...
JTA是Java平台的标准API,允许应用程序在不同的资源管理器(如数据库、消息队列)之间进行分布式事务处理。JTA定义了事务管理器和资源管理器之间的接口,使得开发者可以编写跨系统的事务处理代码,无需关心底层的...
其他面试题如集合、异常处理、IO/NIO、反射、序列化、注解、多线程并发、JVM优化、数据库技术、缓存、NoSQL、框架、消息队列、微服务、Linux等方面的知识同样重要,需要不断学习和实践来提高技能水平。
- **队列服务**:如RabbitMQ或Kafka,将请求放入队列,按顺序处理,避免瞬间大量请求冲击数据库。 - **缓存技术**:利用Redis进行数据缓存,减少数据库访问压力,提高响应速度。 - **数据库优化**:使用乐观锁或...
这个毕业设计不仅提供了完整的论文,还包含了答辩PPT、源代码以及数据库文件,为学习者提供了一个全面了解和实践Java即时通讯系统的机会。 1. **Java技术基础**:Java是一种跨平台的编程语言,以其健壮性、安全性及...
在计算机科学中,解决约瑟夫生死游戏通常采用数据结构——队列,因为队列具有先进先出(FIFO)的特性,非常适合模拟这种循环淘汰的过程。我们可以将士兵看作队列中的元素,按照一定的步长(即淘汰间隔)来移除队首的...