存储神器——队列_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 存储神器——队列

存储神器——队列

 2013/8/7 4:08:20  guanxianxiao  程序员俱乐部  我要评论(0)
  • 摘要:队列:它可以像数组一样有序的存放对象;但与数组最大的区别就是,它可以自动增长。1.先定义队列接口2.编写一个接口的实现类,就可以把它当做一个对列使用实现队列的思路是:在实现类的内部,还是使用数组保存装入队列的对象;每次新加入对象时,则创建一个比原来数组长度大于一的数组,将原数组的对象赋给新数组,将新加入的对象加到新数组末尾。然后,将新数组的首地址传给原来的数组。现在,只要创建这个类的对象,就有了一个可自动增长的“队列”对象了。//定义队列接口publicinterface接口名
  • 标签:队列
队列:它可以像数组一样有序的存放对象;但与数组最大的区别就是,它可以自动增长。

1.先定义队列接口
2.编写一个接口的实现类,就可以把它当做一个对列使用

实现队列的思路是:在实现类的内部,还是使用数组保存装入队列的对象;每次新加入对象时,
则创建一个比原来数组长度大于一的数组,将原数组的对象赋给新数组,将新加入的对象加到新数组末尾。
然后,将新数组的首地址传给原来的数组。现在,只要创建这个类的对象,就有了一个可自动增长的“队列”
对象了。


//定义队列接口
public interface 接口名{
    //定义方法
   
    //向队列中加入对象
    public void add(对象类型 对象名);
    //取得队列中指定位置的一个对象
    public 对象类型   get(int index);
    //得到队列的长度
    public int getsize();
   
    //其它方法可自己定义
    ·······
    ····

}

//定义队列接口实现类
public class 类名 implements 接口名{

//先声明一个长度为零的数组,用来装对象
private 类名[] srcA = new 类名[0];
//定义一个数组长度
private int size=0;

//添加方法
public void add(对象类型 对象名){
//1.新建一个数组,长度是原数组长度+1;
类名 [] 类名 = new 类名[srcA.length+1];
//2.将原数组的值赋给新数组
for(int i=0;i<srcA.length;i++){
类名 [i] = srcA[i];
}
//3.将要添加的对象添加到新数组的末尾
类名[srcA.length] = 对象名;
//4.将新数组的首地址传给原数组
srcA = 类名;
//5.队列长度加一
size++;
}

//返回队列中指定位置的对象
public void get(int index){
1.判断是否超出范围
if(index<0||index>size){
return null;
}
else{
return 类名[index];
}
}

//返回队列长度
public int getsize(){
return size;
}

//实现其他的方法
····
··
·

}

泛型关键字<E>
上述队列有一个缺点只能放入某个特定的类的对象,为了解决这个问题,我们可以使用“泛型”语法来解决这
个问题,简单的说,就是创建队列的时候,指定队列的中所存放的对象的类型。
1、自定义泛型队列接口的实现

public interface 接口名<E>{
//向队列中加入对象
public void add(E e);
//去的队列指定位置的对象
public E get(int index);
//其他方法
。。。
}

2、实现的泛型队列
public class 队列名<E> implements 接口名<E>{
//队列内部初始用来装对象的数组,长度为0
priavte Object[] array0 = new Object[0];


//实现接口中 的方法

//添加方法
public void add(E e){
//新建一个数组,长度为原数组长度加一
Object[] array = new Object[array0.length+1];
//将要加入的对象加入到队列的末尾
array[array0.length] = e;
//将原数组内的东西放到新数组中
for(int i=0;i<array0.length;i++){
array[i] = array0[i];
}
//指向新数组
array0 = array;

}

//得到指定队列中指定位置的一个对象,如果指定类型,则转为指定类型返回
public E get (int index){
E st = (E)array0[index];
return st;
}

//实现其他方法
。。。。

}


课后总结:队列实际上就是综合了 数组和引用传递的知识,要知道new一个新数组,数组名中
存的是指向指定大小堆空间 的地址。声明一个空数组作用类似于先得到一个指向堆空间
的地址,将要加的对象加入到新的比原数组长度大一的数组中,再用引用传递将新数组
在堆空间的的地址赋给原数组,此时原数组就指向新数组在堆空间中开辟的空间,于是
就可以调用其中的值或者对象。

队列的使用步奏:
1、实例化一个队列对象
2、调用队列对象相应的方法,实现增删改查等功能




队列接口:



public interface CustomList<E> {
	
	/**
	 * 添加 E类型的数据到末尾
	 * @param e  要添加的值
	 */
	public void add(E e);
	
	/**
	 * 获取指定位置的数据
	 * @param index 位置索引
	 * @return 返回索引位置的数据
	 */
	public E get(int index);
	
//	/**
//	 * 添加到指定位置
//	 * @param e  要添加的值
//	 * @param index 位置索引
//	 */
//	public void add(E e,int index);
	
	/**
	 * 
	 * @return 返回数组的长度
	 */
	public int getsize();

	
//	/**
//	 * 删除索引位置的数据
//	 * @param index 索引位置
//	 */
//	public void delete(int index);
	
	
	
	
}





队列接口实现类:


public class CustomListImp<E> implements CustomList<E>{

	private Object[] array ; 
	private int size=0;
	
	public CustomListImp(){
		array = new Object[0]; 
	}
	
	public void add(E e) {
		
//		1、新建一个tarray数组
		Object[] tarray = new Object[array.length+1];
//		2、将要加入的对象放入新数组的末尾
		tarray[array.length] = e;
//		3、将原数组中的数据放到新数组中
		for(int i=0;i<array.length;i++){
			tarray[i] = array[i];
		}
//		4、指向新数组
		array=tarray;
//		5、数组长度加一
		size++;
	}

	/**
	 * 取得队列中指定位置的对象,如果指定了类型,则转为指定类型返回
	 */
	public E get(int index) {
		if(index<0||index>size-1){
			return null;
		}
		else{
			return (E)array[index];
		}
	}

	/**
	 * 得到队列的长度
	 */
	public int getsize() {
		return array.length;
	}
	
}



发表评论
用户名: 匿名