`
kuailehuahua
  • 浏览: 7019 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
社区版块
存档分类

队列(动态数组)的创建与测试

阅读更多

优化后的版本:

(1)队列接口ListInterface

 

public interface ListInterface<E> {
	//添加元素
	public void add(E e);
	//取得元素
	public E get(int index);
	//删除元素
	public void delete(int index);
	//删除所有元素
	public void deleteAll();
	//插入元素
	public void insert(E e,int index);
	//修改元素
	public void modify(E e,int index);
	//取得队列的实际大小
	public int size();
	

}

 (2)队列接口实现类

public class ListImp<E> implements ListInterface<E> {
	//创建属性:队列初始大小、变化率
	private int initNum=10;
	private int num=10;
	//创建原队列对象
	Object[] src=new Object[10];
	//构造函数
	public ListImp(){}
	public ListImp(int n){
		this.num=n;
	}
	public ListImp(int initN,int n){
		this.initNum=initN;
		this.num=n;
	}
	//添加元素
	public void add(E e){
		if(this.size()>=src.length){
			Object[] dest=new Object[src.length+num];
			System.arraycopy(src, 0, dest, 0, src.length);
			src=dest;
		}
		src[this.size()]=e;
		
		
	}
	//取得元素
	public E get(int index){
		if(index<0||index>=this.size()){
			System.out.println("输入下标不正确!");
			return null;
		}
		else
		return (E)src[index];
		
	}
	//删除元素
	public void delete(int index){
		if(index<0||index>=this.size()){
			System.out.println("输入下标不正确!");
		}
		else{
		Object[] dest1=new Object[src.length-1];
		System.arraycopy(src, 0, dest1,0,index);
		System.arraycopy(src,index+1,dest1,index,this.size()-index-1);
		src=dest1;
		}
		
	}
	//删除所有元素
	public void deleteAll(){
		src=new Object[0];
		
	}
	//插入元素
	public void insert(E e,int index){
		if(index<0||index>=this.size()){
			System.out.println("输入下标不正确!");
		}
		else{
		if(this.size()>=src.length){
			Object[] dest2=new Object[src.length+num];
			System.arraycopy(src, 0, dest2,0,src.length);
			src=dest2;
		}
		for(int i=this.size();i>index;i--){
			src[i]=src[i-1];
		}
		src[index]=e;
		}
		
	}
	//修改元素
	public void modify(E e,int index){
		this.delete(index);
		this.insert(e, index);
		
	}
	//取得队列的实际大小
	public int size(){
		int count=0;
		for(int i=0;i<src.length;i++){
			if(src[i]!=null){
			count++;
			}
		}
		return count;
	}



}

  

(3)队列类的测试

 

public class ListTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ListImp<String> list=new ListImp<String>(5,10);
		//为队列插入4个元素(<5)
		for(int i=0;i<4;i++){
			list.add("元素"+i);
		}
		//为队列插入10个元素(>5)
//		for(int i=0;i<10;i++){
//			list.add("元素"+i);
//		}
		//为下标为-1的位置插入元素
		list.insert("新插入的元素0", -1);
		//为下标为10的位置插入元素(>=4)
        list.insert("新插入的元素1", 4);
        //为下标为2的位置插入元素(<4)
        list.insert("新插入的元素2", 2);
        //修改下标为-1的元素
        list.modify("修改后的元素0", -1);
        //修改下标为4的元素(>=4)
		list.modify("修改后的元素1", 4);
		//修改下标为2的元素(<4)
		list.modify("修改后的元素2", 2);
		//同上测试delete(int index)方法
		list.delete(-1);
		list.delete(4);
		list.delete(2);
		//测试deleteAll()方法
		list.deleteAll();
		//将队列中的所有元素输出
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}

	}

}

 优化的地方:

1、泛型的运用:将队列存储元素的范围扩大为所有类对象(除基本数据类型)

2、为队列中的存储元素数组src设置初始大小initNum和大小的增长率num,这样可以通过判断数组的存储满否情况来创建新的存储数组,而勿需每次操作都创建一次新数组,提高了程序运行速率(减少相同的操作)

3、运用System.arraycopy(Object.src,int srcpos,Object dest,int destpos,int length);方法替代for循环语句,提高了程序运行速率(学会运用已有的类方法)

4、重载ListImp类的构造方法,让用户自己为属性initNum和num赋值,从而增加程序的用户交互性

5、考虑到index的各种取值,故需要if条件判断语句,从而增加程序的完整性

易错的地方(需要注意的地方):

1、添加泛型后,各种形参、返回值、均变为泛型;同时定义数组时不能使用泛型(故使用Object),因此get(int index)函数的返回值必须进行强制转换

2、deleteAll()方法中直接令src=new Object[0]即可

3、两个方法不能相互调用,否则会形成死循环

4、测试ListImp类时要测试各个方法的所有情况

 

分享到:
评论

相关推荐

    队列的数组实现与测试代码(C语言)

    `main.cpp`文件包含了测试代码,用于创建队列,插入元素,执行出队操作,查看队头元素,以及检查队列状态等。这些测试可以帮助确保队列的实现符合预期,没有逻辑错误。 在实际编程中,队列可以应用于很多场景,如...

    循环数组实现队列.doc

    循环数组实现队列是数据结构中的一个重要概念,队列遵循先进先出(FIFO, First In First Out)的原则,即最早进入队列的元素最先离开队列。在计算机科学中,队列通常用于处理需要按顺序执行的任务,例如任务调度、多...

    JS使用数组实现的队列功能示例

    - **构造函数Queue()**:用于创建一个空的队列,队列内部使用一个数组`dataStore`来存放元素。 - **enqueue(element)**:向队列的尾部添加一个元素`element`。这个方法使用`push`函数将元素添加到数组的末尾。 - *...

    队列的创建,销毁,清空,入队,出队,判空,判满等操作

    在C语言中,我们可以自定义一个队列结构,如`Queue`,并用动态内存分配函数`malloc()`为队列的头部和尾部指针分配内存。在`QUEUE.H`头文件中,可能会定义队列结构体和相应的创建函数,如`CreateQueue()`。 ```c ...

    多线程使用同一数组测试

    7. **并发模式(Concurrent Patterns)**:使用生产者-消费者模型,通过队列等数据结构来避免直接操作数组,从而实现线程间的协作。 8. **异步编程(Asynchronous Programming)**:利用VB.NET的异步等待(`Async`/...

    Java数组队列概念与用法实例分析

    四、测试与应用 为了验证ArrayQueue的正确性,通常会创建一个TestMain类,其中包含main()方法。在main()方法中,可以创建ArrayQueue对象,执行入队、出队等操作,并打印队列状态以检查结果是否符合预期。 总的来说...

    二项队列的C实现

    6. **二项队列的优化**:为了提高效率,二项队列通常采用动态扩容的方式,当队列满时,会创建一个新的更大的二项队列,然后将旧队列的元素转移到新队列中。 7. **代码实现**:在C语言中,可以定义一个结构体来表示...

    队列的创建,入队,出队

    - `Queue.exe`是编译后的可执行文件,可以直接运行来测试队列操作。 - `*.dep`、`*.pdb`、`*.idl`、`*.manifest`等文件是C++编译过程中的依赖文件、调试信息和元数据文件。 总结,队列是一种基础且重要的数据结构...

    实验4 队列.zip

    可能包括创建队列、入队、出队的代码示例,以及相关的测试用例。此外,实验可能还会涉及到队列的其他变种,比如: - **优先级队列(Priority Queue)**:元素根据优先级排序,优先级高的元素优先出队。 - **阻塞队列...

    链队列程序

    链队列与普通数组实现的队列不同,它不需预先分配固定大小的存储空间。在链队列中,每个元素(称为节点)包含一个数据域和一个指针域,用于存储数据和指向下一个节点的引用。这样,队列可以在内存中动态扩展或收缩,...

    队列的C语言实现

    在C语言中,我们可以用一维数组来模拟队列。数组的前半部分作为队头,后半部分作为队尾。当队列满时,可以通过调整队头和队尾的位置来腾出空间。这种方式的优点是实现简单,但缺点是空间利用率不高,因为队列大小是...

    数据结构实验报告2-栈与队列-队列基本操作算法-实验内容及要求.docx

    - `char *elem`:字符型数组,用于存储队列中的元素。 - `int n`:队列的最大容量。 - `int f`:队头指针,指向队头元素的位置。 - `int r`:队尾指针,指向队尾元素的下一个位置,保持队头队尾之间有一个空闲...

    利用一维数组中的数据构造完全二叉树

    4. **主函数**:创建了一个测试数组,并调用`CREATREE`函数创建二叉树,最后输出指定节点的数据。 ```cpp void main() { int a[] = {1, 4, 3, 45, 23, 6, 7, 9, 15, 56}; btree *o = CREATREE(a, 10); cout ...

    队列建立和队列的逆置

    1. **栈辅助逆置**:创建一个空栈,依次将队列中的元素出队并压入栈中,直到队列为空。然后将栈中的元素依次弹出并入队,这样队列就被逆置了。 2. **两次遍历逆置**:首先遍历队列,记录下所有元素,然后再次遍历,...

    C++数据结构之链式队列实现

    链式队列与数组实现的队列相比,优点在于动态扩展能力,它不需要预先确定队列的大小。 ### 2. 链式队列的节点结构 链式队列通常由一系列节点组成,每个节点包含一个数据域和一个指针域。在C++中,可以定义一个...

    php实现队列操作的类.zip

    9. **测试与示例**: 为了确保类的正确功能,通常会提供测试用例或示例代码,演示如何创建队列、添加和移除元素、检查队列状态等。 总结来说,`queueOp.class.php`提供的`QueueOp`类为PHP开发者提供了一种方便的...

    入队列出队列练习_Labview队列的使用_labview队列_

    队列可以存储不同类型的数据,如数值、字符串、数组等。在“入队列出队列练习.vi”中,可能使用了不同类型的示例数据来演示这一功能。 接着,我们学习如何向队列中添加元素,这通常通过“入队”函数完成。此函数将...

    Android之循环队列操作

    与普通队列不同,循环队列在空间上形成一个环形结构,当队尾达到数组边界时,可以重新回到数组的起始位置,从而避免了满队列时需要创建新队列的问题。这提高了空间利用率并简化了管理过程。 在Java或Android环境中...

    c语言 循环队列

    1. 初始化队列:创建队列时,通常将front和rear都设置为0,表示队列为空。 2. 入队(enqueue):向队列中添加新元素时,rear指针向后移动一位,然后将新元素存入对应位置。如果rear即将超出数组边界,那么它会"循环...

    队列应用 入队 出队

    10. 主函数:主函数用于测试队列的各种操作,包括入队、出队、获取队头元素、获取队列长度等。 队列是一种重要的数据结构,广泛应用于计算机科学和信息技术领域。队列的操作包括入队、出队、获取队头元素、获取队列...

Global site tag (gtag.js) - Google Analytics