数组与数组队列
一、数组:
数组是有序的在定义时已经设定好大小,能存储多种数据类型,根据用途还可以分为n维数组。以下是数组的定义方式:
一维数组
1、数组类型[]数组名=new 数据类型[长度];
2、数据类型 [] 数组名 = {值,...};
3、数据类型 [] 数组名 = new 数据类型[]{值,...};
4、数据类型 [] 数组名;
数组名 = new 数据类型[长度];
5、数组名 = new 数据类型[]{值,...};
二维数组
1、数据类型 [][] 数组名 = new 数据类型[行][列];
2、数据类型 [][] 数组名 = {{值,...},...};
3、数据类型 [][] 数组名 = new 数据类型[][]{{值,...},...};
4、数据类型 [][] 数组名;
数组名 = new 数据类型[行][列];
5、数组名 = new 数据类型[][]{{值,...},...};
数组的使用必须先给对象(实例化),再使用:
Array[0]=new Object();
Object obj=Array[0];
obj.方法名(参数);
数组的使用涉及到了数组越界的问题,那么如何来获得数组的界限呢?
1、获取一维数组的元素总数:数组名.length;
2、获取二维数组的行的列数:数组名[r].length;(所谓二维数组,其实是一维数组的一维数组,所以可以认为 数组名[][] 为数组名为数组名[]的一维数组 );
3、获取二维数组的行数:数组名.length;
而获取指定位置的数据:数组名[下标];
数组名[行下标][列下标];(二维数组中的位置抽象为行与列的存在)。
二、数组的优点与缺点
优点:数组在使用时可以说是很方便了,每一个数据都有他的下标,所以需要用到指定位置的数据时只需要,给定下标就好,寻找方便;
缺点:大小是固定,不能根据数据总数的变化进行更改大小。
三、数组队列:
数组队列的主要作用是优化数组,对其缺点进行覆盖。首先需要想到数组名中存储的是什么?是在堆空间中的内存首地址。所以我们可以创建一个数组队列类,在其中定义一个初始大小为0的数组;在其中添加数据、删除数据、查找数据、修改数据的方法。
四、数组队列的代码实现:
1、代码如下:
public class Arrayqueue { //原数组 private Object[] obj_1=new Object[0]; private int size;//存储数组的大小 //添加数据 public void add(Object date){ //新建一个数组 是原数组长度+1 //数组必须先给对象才能用 Object[] obj_2=new Object[obj_1.length+1]; //将原数组的数据移进新数组 for(int i=0;i<obj_1.length;i++){ obj_2[i]=obj_1[i]; } //将要加入的数据加到最后一位 obj_2[obj_1.length]=date; //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size++; } //根据索引删除 public void delete(int index){ if(index < 0 || index >= size){ throw new RuntimeException("索引越界!"); }else { //新建一个数组 是原数组长度+1 Object[] obj_2=new Object[obj_1.length-1]; for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组 obj_2[i]=obj_1[i]; } for(int j=index;j<obj_2.length;j++){//将所要删除的位置之后的所有数据赋予新数组 obj_2[j]=obj_1[j+1]; } //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size--; } } //根据索引查找 public Object find(int index){ if(index < 0 || index>= size){ throw new RuntimeException("索引越界!"); }else{ return obj_1[index];//返回查找的数据 } } //修改 public Object redo(int index,Object date){ if(index < 0 || index>= size){ throw new RuntimeException("索引越界!"); }else{ obj_1[index]=date; return obj_1[index];//返回修改的数据 } } public int size(){ return size;//返回数组的大小 } }
2、写一个测试类对其进行测试:
public class Test_1 { // 程序入口 public static void main(String[] args) { //实例化Arrayqueue的对象 Arrayqueue aq=new Arrayqueue(); for(int i=0;i<8;i++){ Object obj1=new Object("张三"+i,i); aq.add(obj1); } //修改数据 Object date=new Object("李四 ",100); aq.redo(0, date); //删除 aq.delete(3); //添加数据(加到最后一位) Object date_1=new Object("王五 ",300); aq.add(date_1); Print(aq);//打印数据 } //打印数据的方法 public static void Print(Arrayqueue aq){ for(int t=0;t<aq.size();t++){ Object obj= (Object) aq.find(t); obj.Show(); } } }
3、简单的Object类:
public class Object { private String name; private int grade; public Object(String name,int grade){ this.name=name; this.grade=grade; } public void Show(){ System.out.println("name: "+name+" "+"grade: "+grade); } }
五、结
数组队列的实现还是遇到了不少的坎的,但是在真正理解了以后每一句代码又是那么的明了。以下浅谈我遇到的问题
1、空指针异常:
【Exception in thread "main" java.lang.NullPointerException
at com.czj1109.Test_1.Print(Test_1.java:33)
at com.czj1109.Test_1.main(Test_1.java:26)
name: 李四 grade: 100
name: 张三1 grade: 1
name: 张三2 grade: 2】编译结果
********引起错误的代码********
//根据索引删除的方法 public void delete(int index){ if(index < 0 || index >= size){ throw new RuntimeException("索引越界!"); }else { //新建一个数组 是原数组长度+1 Object[] obj_2=new Object[obj_1.length-1]; for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组 obj_2[i]=obj_1[i]; } for(int j=index+1;j<obj_1.length-1;j++){//将所要删除的位置之后的所有数据赋予新数组 obj_2[j]=obj_1[j+1]; } //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size--; } }
********修改错误之后的代码********
//根据索引删除的方法 public void delete(int index){ if(index < 0 || index >= size){ throw new RuntimeException("索引越界!"); }else { //新建一个数组 是原数组长度+1 Object[] obj_2=new Object[obj_1.length-1]; for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组 obj_2[i]=obj_1[i]; } for(int j=index;j<obj_2.length;j++){//将所要删除的位置之后的所有数据赋予新数组 obj_2[j]=obj_1[j+1]; } //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size--; } }
2、有待完善的地方
//根据内容删除(需重写equals方法)
public void delete(Object date){
}
这一方法还没能够实现。
以上便是我在实现数组队列时的优化分析、思路、以及遇到的问题。
2014 11 15
梣梓
相关推荐
在Java中,我们可以使用数组来实现优先队列。这篇文章将探讨如何利用数组实现优先队列,并通过提供的`PriorityQ.java`文件来深入理解其实现原理。 1. **优先队列基本概念** 优先队列是一种数据结构,它维护了一个...
队列是一种线性数据结构,与栈不同的是,队列中的元素按照它们加入队列的顺序进行操作。队列有两个主要的操作:入队(enqueue)和出队(dequeue)。入队是在队列的一端添加元素,而出队是从另一端移除元素。队列的...
为了实现队列操作,数组队列通常需要两个额外的变量来跟踪队头和队尾。添加元素时,如果队列已满,则需要进行扩容操作;移除元素时,如果队列为空,会抛出异常。这种基于数组的队列虽然在空间效率上比链表实现的队列...
java数组实现循环队列。包括入队, 出队,输出队列。 队列先入先出。
6. 队列扩容:当队列满时,可以创建一个更大的新数组,然后将旧数组中的元素复制到新数组中。 ### 链表实现队列 链表实现队列更加灵活,因为它的大小可以根据需要动态扩展。链表由一系列节点组成,每个节点包含...
### 循环链表队列与循环数组队列的代码实现解析 在计算机科学中,队列是一种重要的数据结构,遵循先进先出(FIFO)原则。队列可以使用多种方式实现,包括链表和数组。本文将深入探讨两种队列实现方式:循环链表队列...
普通队列 1)将尾指针往后移:rear+1,当front==rear【空】 2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数中组元素中,否则无法存入数据。rear==maxSize-1[队列满] 环形队列 1)front变量的...
队列是一种先入先出的数据结构(FIFO),只允许在前端(front)删除,在后端(rear)插入。容量为capacity大小的内存,只能存capacity-1的元素,其中rear的位置始终为空。 本文实现的队列,功能如下: 1 获取元素内容 ...
本篇内容介绍了一种改进的基于数组实现的队列结构,特别之处在于引入了一个`tag`标记来优化队列的操作判断逻辑,使得队列在判空(判断是否为空)与判满(判断是否已满)时更加高效准确。这种实现方式相较于传统基于...
队列的数组实现,用C++写的,适合初学者。
循环数组实现队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列的操作受限制,和栈一样,它是一种操作受限制的线性表。进行插入操作的...
本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...
在普通数组队列中,一旦队列满或空,需要进行数组的重新分配,而循环队列则避免了这个过程,提升了性能。 在编程语言中,如C、C++、Java或Python,我们可以用不同的方式实现数组循环队列。例如,在C++中,可以定义...
由数组实现队列,包括队列的创建、入队和出队。通过打印显示出队的结果。正在学习数据结构的童鞋可以参考。
学习数据结构过程中,亲自在VC++上编译通过的使用数组实现队列的源代码,与大家共享。
更好了解数组和队列在C++应用开发当中使用,明白C++的变量内存结构。
循环队列是一种特殊的数据结构,它通过将数组的尾部与头部连接起来形成一个圆圈来解决传统队列在数组实现时可能出现的“假溢出”问题。当队列中的元素被不断加入和移除后,队首指针(head)和队尾指针(tail)会逐渐...
配套代码讲解:https://blog.csdn.net/songchuwang1868/article/details/90200251 ...同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列
循环队列是一种线性数据结构,它在物理结构上表现为一个有限大小的数组,但在逻辑结构上,队尾被连接到队头后面,形成一种循环的结构。在C++中,我们可以利用数组来轻松实现这种数据结构。下面将详细介绍如何用数组...