数组队列
队列这个名词,字面上除了让人想着他可能是军训的时候我们排着的一对或一列之外,没有别的很直面意思。
学习后大概了解到,在程序语言上,队列归属于一种数据存储结构。刚接触的时
候,一提到队列,“先进先出”四个字就在脑袋里晃啊晃,其修改原理就是秉着“先进先出”的原则~~~
好比我们在排队买票的时候,排在队伍前面的人先买,后面来的人只能往队伍后面站,强行硬插的话就会被人指责一样,先排队的先办完事走人。
队列的操作可以由数组和链表两种形式实现。
上一篇博客有写过链表实现队列的过程,这一篇来总结一下数组实现队列的过程!!
I think:
相比链表,数组实现队列的代码会比较好写一些,他不用像链表一样需要通过引用来从头开始查找,而是直接用下标就可以找到相应位置的数据。
只是数组在一开始就要必须定义他的大小,如果小了就会越界,过大又会浪费内存。
要改动数据时,得再定义一个数组,将改动后不会变的初始数组元素与改动数据一个一个的重新赋予给新的数组,最后再把新数组的地址传让初始的数组。
.额......还是直接上代码来说明一切吧~
首先目标是:通过数组队列,存储学生信息,实现学生信息的添加,删除,修改,查找,插入等方法。
一,定义一个学生类,存储学生的姓名和学分信息。
public class Students { private String name;//声明姓名属性 private int score;//声明学分属性 /** * 构造方法,用来创建对象的(类名 对象名 = new 构造方法(参数值,...);) */ public Students(String name,int score){ this.name = name; this.score = score; } /** * 给姓名属性设置值的方法 * @param name要赋给属性的参数 */ public void setName(String name){ this.name = name; } /** * 获取姓名属性值的方法 * @return name姓名属性的值 */ public String getName(){ return name; } public void setScore(int score){ this.score = score; } public int getScore(){ return score; } /** * 重写一个toString方法 */ public String toString(){ return "姓名:"+name+" 学分:"+score; } }
二,定义一个数组队列类
public class StuArrayQueue { // 声明一个初始数组 private Students[] array; // 声明一个存储元素总数的计数器 private int size = 0; // 声明一个变量,用来计算数组中能存储多少个元素 private int length; /** * 构造方法 */ public StuArrayQueue() { array = new Students[0]; } /** * 构造方法 * * @param length表示初始数组队列的大小 */ public StuArrayQueue(int length) { this.length = length; array = new Students[length]; } /** * 向数组队列中添加元素的方法 * * @param stu就是要添加到数组队列中的元素 */ public void add(Students stu) { if (length <= size) {// 如果初始数组队列的大小<=元素的个数 // 创建一个新数组,是初始数组的长度+1. Students[] temp = new Students[size + 1]; // 将初始数组中的数据存入到temp中 for (int i = 0; i < array.length; i++) { temp[i] = array[i]; } temp[size++] = stu;// 将新数据存入到temp数组的末尾 array = temp;// 将temp数组名中存储的地址赋给array } else { array[size++] = stu; } } /** * 获取指定索引位置的元素 * * @param index指定的索引位置 * @return 返回null表示索引不存在,否则会返回对应索引的元素 */ public Students get(int index) { if (index < 0 || index >= size) { throw new RuntimeException("索引越界!"); } return array[index]; } /** * 移除索引位置的元素值 * * @param index */ public Students remove(int index) { Students a = array[index]; if (index < 0 || index > size) { throw new RuntimeException("索引越界"); } else { Students[] temp = new Students[array.length - 1];// 重新定义一个数组temp,长度比Array小一 for (int i = 0; i < index; i++) {// index之前的temp值都与Array相等 temp[i] = array[i]; } for (int j = index; j < array.length - 1; j++) { temp[j] = array[j + 1]; } array = temp;// 不可少 } size--;// 数组元素个数递减 return a; } /** * 在在数组队列中插入元素 * * @param s为要插入的元素 * @param index为想要插入元素的位置 * */ public void addNew(Students stu, int index) { if (index < 0 || index > size) { throw new RuntimeException("索引越界"); } else { Students[] temp = new Students[array.length + 1]; for (int i = 0; i < index; i++) { temp[i] = array[i]; } temp[index] = stu; for (int j = index; j < array.length; j++) { temp[j + 1] = array[j]; } array = temp;// 不可少 } size++; } /** * 根据内容得出元素所在的位置 * @param stu 想要找到的元素的数据 * @return j 为元素所在的位置 */ public int get(Students stu){ int j=0; for (int i = 0; i < size; i++) { if(array[i].getName()==stu.getName() && array[i].getScore()==stu.getScore()){ j=i; } } return j; } /** * 根据内容删除 * @param stu 想要删除的内容 */ public void remove(Students stu){ remove(get(stu)); } /** * 获取数组队列中存储的元素总数 * * @return 返回size */ public int size() { return size; } }
三,然后就是检验方法是否有效的测试类了。
public class StuQueueTest { public static void main(String[] args) { //创建数组队列的对象 StuArrayQueue queue = new StuArrayQueue(); //添加数据 queue.add(new Students("张三",50)); queue.add(new Students("李四",62)); queue.add(new Students("王五",64)); queue.add(new Students("赵六",60)); queue.add(new Students("李明",90)); //检验添加 System.out.println("增加后长度为"+queue.size()); System.out.println("增加后为" ); for(int i=0;i<queue.size();i++){ System.out.println(queue.get(i).toString()); } System.out.println(); //检验索引 System.out.println("索引位置的值为"); System.out.println(queue.get(0)); System.out.println(queue.get(1)); System.out.println(queue.get(2)); System.out.println(queue.get(3)); System.out.println(queue.get(4)); System.out.println(); //检验删除 System.out.println("删除的为"+queue.remove(4)); System.out.println("删除后长度为"+queue.size()); System.out.println("删除后为" ); for(int i=0;i<queue.size();i++){ System.out.println(queue.get(i).toString()); } System.out.println(); //检验插入 queue.addNew(new Students("小风",50),4); System.out.println("添加长度为"+queue.size()); System.out.println("添加后为" ); for(int i=0;i<queue.size();i++){ System.out.println(queue.get(i).toString()); } System.out.println(); //检验根据内容查找 System.out.println("在"+queue.get(new Students("李四",62))); System.out.println(); //检验根据内容删除 queue.remove(new Students("李四",62)); System.out.println("删除后长度为"+queue.size()); System.out.println("删除后为" ); for(int i=0;i<queue.size();i++){ System.out.println(queue.get(i).toString()); } System.out.println(); } }
后记:
相比之前写链表,数组队列的实现耗时还是比较短的。
但是现在在学习的哈夫曼,编码那一块儿又遇到了瓶颈,百思不得其解的感觉相当的不好,.
虽然觉得时间紧迫,但是也知道一口就想吃成胖子的想法很不好,循序渐进,多复习多积累吧。
------------I am a slow walker,but I never walk backwards.
(Abraham.Lincoln America)
相关推荐
普通队列 1)将尾指针往后移:rear+1,当front==rear【空】 2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数中组元素中,否则无法存入数据。rear==maxSize-1[队列满] 环形队列 1)front变量的...
总之,`PriorityQ.java`文件可能是一个简单的数组实现优先队列的示例,通过分析这个文件,我们可以学习到如何利用数组数据结构实现优先队列,以及理解其核心的插入、删除和查找操作。同时,这也能帮助我们更好地掌握...
学习数据结构过程中,亲自在VC++上编译通过的使用数组实现队列的源代码,与大家共享。
在普通数组队列中,一旦队列满或空,需要进行数组的重新分配,而循环队列则避免了这个过程,提升了性能。 在编程语言中,如C、C++、Java或Python,我们可以用不同的方式实现数组循环队列。例如,在C++中,可以定义...
由数组实现队列,包括队列的创建、入队和出队。通过打印显示出队的结果。正在学习数据结构的童鞋可以参考。
本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...
在编程领域,数组和队列是两种非常基础且重要的数据结构。数组提供了一种存储和访问固定数量元素的方式,而队列则是一种先进先出(FIFO)的数据结构,广泛应用于任务调度、缓存管理等领域。本文将深入探讨C#中的数组...
通过学习这个实例,你可以深入了解C#中队列数据结构的实现和应用,掌握泛型在数据结构中的运用,以及如何将不同数据结构(如队列和栈)结合起来解决实际问题。这对你在编程领域的深入理解和实践有着重要的作用。记得...
通过学习这个`QueueArray`类,我们可以了解到Java中如何使用数组高效地实现循环队列,并掌握其核心操作。这个简单的数据结构在实际开发中有着广泛的应用,对于提升程序的性能和逻辑清晰度都大有裨益。
在C++中,标准库提供了一个名为`deque`的容器,但在这里,我们讨论的是一个自定义实现的基于数组的双端队列类模板。 在C++编程中,类模板(Class Template)是泛型编程的一种形式,允许创建可适用于不同数据类型的...
### 什么是环形数组及其学习意义 #### 一、环形数组的概念与特点 环形数组(Circular Array)是一种特殊的数据结构,它在逻辑上将数组的首尾连接起来,形成了一个闭环。这意味着数组的最后一个元素之后紧接着的是...
循环队列是一种线性数据结构,它巧妙地利用了数组的特性,克服了普通队列在满时无法插入元素、空时无法删除元素的问题。 首先,了解数组的基本概念。数组是一系列相同类型的元素在内存中连续存储的集合,可以通过索...
本资源提供了Java实现的数据结构代码,包括栈、动态数组、队列、链表和二叉树,这些都是计算机科学中最基础且重要的数据结构。 1. **栈(Stack)**:栈是一种“后进先出”(LIFO)的数据结构,常用于表达式求值、...
arithmetic java算法冒泡排序、二叉树、数组、链表、队列学习简单示例 private static void mpSoft(String [] data) { for (int i = 0; i ; i++) { System.out.println(Arrays.toString(data)); for (int j = 0; ...
数据结构学习代码,内容包括:稀疏数组、队列、链表、栈、递归的使用、排序算法、查找算法、哈希表、树结构_DataStructure
通过学习和理解这些知识点,你可以掌握如何在C语言中用静态数组实现循环队列,从而在实际编程中灵活运用这一数据结构。同时,通过阅读和分析`Queue_Array-master`项目中的代码,可以加深对循环队列概念的理解,并...
本资源“C语言实现使用静态数组实现循环队列源码.zip”提供了使用C语言编写的静态数组循环队列的实现,非常适合初学者学习和理解这一概念。 循环队列的基本思想是将一个固定大小的数组看作一个首尾相连的环形结构。...
链式队列可以动态增长,但相比数组队列,它的空间利用率较低,且需要额外的指针存储。 在“队列操作.c”文件中,可能包含了以下函数实现: - 初始化队列(InitializeQueue):创建并初始化队列,设置队头和队尾指针...
下面将详细介绍静态数组及其在C语言中的应用,以及如何实现一个简单的静态数组队列。 首先,静态数组是固定大小的数组,其大小在声明时必须确定,之后不能更改。在C语言中,声明静态数组的基本语法如下: ```c ...
数据结构与算法的学习:_稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、_dataStructuresAndAlgorithm