1.什么是队列
队列是一种线性结构,只能从一端插入从另一端删除,即“先进先出,后进后出”。
2.链表与队列的区别
链表是指用一组任意的存储地址存储线性表的数据结构。笔者认为从形式上来看队列与链表的区别在于链表可以在任意位置插入和删除元素而队列只能从一端插入另一端删除。
3.为什么要使用数组队列
笔者的上一篇文章讲到了数组,数组是所有数据结构中存储和读取速度最快的线性结构,但是在一定的场合下使用数组有诸多不便。比如:要存储的数据长度暂时无法确定或者要存储的一组数据数据类型不一致。此时我们就要使用数组队列来解决问题了。
4.数组队列的实现原理
1)长度扩展问题
由于Java中没有指针,所以不能利用指针来动态扩展数组的长度。但是数组名保存的是数组的首地址,我们可以利用这个原理来实现数组长度的扩展(具体实现见下文的代码)。
2)数据类型扩展问题
利用泛型来解决。所谓泛型,它不是一种数据类型,只是一种符号,表示符号有E、K、V等。当你要存储的数据类型不确定时可以使用泛型来表示
5.数组队列基本方法的实现
package shuzuduilie;
public class MyArrayList<E> {
// 定义数组
private Object[] array;
// 定义变量保存数组长度
private int size;
/*
* 定义无参构造函数,初始化一个长度为0的数组
*/
public MyArrayList() {
array = new Object[0];
}
/*
* 定义构造函数初始化一个长度为len的数组
*/
public MyArrayList(int len) {
array = new Object[len];
}
/*
* 在数组中添加元素
*/
public void add(E e) {
// 定义标志变量判断是否需要实例化新数组
boolean flag = true;
// 若原数组长度有空余则将元素放入原数组
for (int i = 0; i < array.length; i++) {
if (array[i] == null) {
array[i] = e;
size++;
//改变标志变量
flag = false;
//跳出循环
break;
}
}
// 原数组长度不够需要实例化新数组来增加长度
if (flag==true) {
Object[] newArray = new Object[array.length + 5];
// 将原数组中所有的元素放入新数组中
for (int j = 0; j < array.length; j++) {
newArray[j] = array[j];
}
// 将要添加的元素放入新数组的末尾
newArray[array.length] = e;
size++;
// 将新数组的首地址赋给原数组
array = newArray;
}
}
/*
* 获取指定位置的元素
*/
public E get(int index) {
//若长度超出范围则返回null
if(index<0||index>=this.size()){
return null;
}else
return (E) array[index];
}
/*
* 获取数组中的元素个数
*/
public int size(){
return size;
}
/*
* 在指定位置插入元素
*/
public void add(int index,E e){
if(index<0){
System.out.println("请输入有效位置");
}else if(index==0){
if(array.length!=0){
array[0]=e;
//若array[0]在插入前为null则需增加长度
if(array[0]==null)
size++;
}else{
this.add(e);
}
}else{
if(index>array.length){
System.out.println("请输入有效位置");
}else if(index==array.length){
//数组队列只能按顺序插入,若前一个元素为空则插入无效
if(array[index-1]==null){
System.out.println("请输入有效位置");
}else{
this.add(e);
}
}else{
if(array[index-1]==null){
System.out.println("请输入有效位置");
}else{
if( array[index]==null){
array[index]=e;
size++;}
else{
//用新元素覆盖原有元素
array[index]=e;
}
}
}
}
}
/*
* 移除末尾元素
*/
public void remove(){
array[size]=null;
size--;
}
}
另:1)本文只是介绍了自己如何用代码实现一个数组队列,但是在实际操作中完全可以使用Java类库中的ArrayList来实现以上功能。
2)各种数据结构并无优劣之分,只是扮演的角色不一样。本文虽列举了数组的一些缺点,但是这并不代表数组队列就是数组的一种优化,二者均有不可替代的作用。