优化后的版本:
(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类时要测试各个方法的所有情况
分享到:
相关推荐
`main.cpp`文件包含了测试代码,用于创建队列,插入元素,执行出队操作,查看队头元素,以及检查队列状态等。这些测试可以帮助确保队列的实现符合预期,没有逻辑错误。 在实际编程中,队列可以应用于很多场景,如...
循环数组实现队列是数据结构中的一个重要概念,队列遵循先进先出(FIFO, First In First Out)的原则,即最早进入队列的元素最先离开队列。在计算机科学中,队列通常用于处理需要按顺序执行的任务,例如任务调度、多...
- **构造函数Queue()**:用于创建一个空的队列,队列内部使用一个数组`dataStore`来存放元素。 - **enqueue(element)**:向队列的尾部添加一个元素`element`。这个方法使用`push`函数将元素添加到数组的末尾。 - *...
在C语言中,我们可以自定义一个队列结构,如`Queue`,并用动态内存分配函数`malloc()`为队列的头部和尾部指针分配内存。在`QUEUE.H`头文件中,可能会定义队列结构体和相应的创建函数,如`CreateQueue()`。 ```c ...
7. **并发模式(Concurrent Patterns)**:使用生产者-消费者模型,通过队列等数据结构来避免直接操作数组,从而实现线程间的协作。 8. **异步编程(Asynchronous Programming)**:利用VB.NET的异步等待(`Async`/...
四、测试与应用 为了验证ArrayQueue的正确性,通常会创建一个TestMain类,其中包含main()方法。在main()方法中,可以创建ArrayQueue对象,执行入队、出队等操作,并打印队列状态以检查结果是否符合预期。 总的来说...
6. **二项队列的优化**:为了提高效率,二项队列通常采用动态扩容的方式,当队列满时,会创建一个新的更大的二项队列,然后将旧队列的元素转移到新队列中。 7. **代码实现**:在C语言中,可以定义一个结构体来表示...
- `Queue.exe`是编译后的可执行文件,可以直接运行来测试队列操作。 - `*.dep`、`*.pdb`、`*.idl`、`*.manifest`等文件是C++编译过程中的依赖文件、调试信息和元数据文件。 总结,队列是一种基础且重要的数据结构...
可能包括创建队列、入队、出队的代码示例,以及相关的测试用例。此外,实验可能还会涉及到队列的其他变种,比如: - **优先级队列(Priority Queue)**:元素根据优先级排序,优先级高的元素优先出队。 - **阻塞队列...
链队列与普通数组实现的队列不同,它不需预先分配固定大小的存储空间。在链队列中,每个元素(称为节点)包含一个数据域和一个指针域,用于存储数据和指向下一个节点的引用。这样,队列可以在内存中动态扩展或收缩,...
在C语言中,我们可以用一维数组来模拟队列。数组的前半部分作为队头,后半部分作为队尾。当队列满时,可以通过调整队头和队尾的位置来腾出空间。这种方式的优点是实现简单,但缺点是空间利用率不高,因为队列大小是...
- `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. **两次遍历逆置**:首先遍历队列,记录下所有元素,然后再次遍历,...
链式队列与数组实现的队列相比,优点在于动态扩展能力,它不需要预先确定队列的大小。 ### 2. 链式队列的节点结构 链式队列通常由一系列节点组成,每个节点包含一个数据域和一个指针域。在C++中,可以定义一个...
9. **测试与示例**: 为了确保类的正确功能,通常会提供测试用例或示例代码,演示如何创建队列、添加和移除元素、检查队列状态等。 总结来说,`queueOp.class.php`提供的`QueueOp`类为PHP开发者提供了一种方便的...
队列可以存储不同类型的数据,如数值、字符串、数组等。在“入队列出队列练习.vi”中,可能使用了不同类型的示例数据来演示这一功能。 接着,我们学习如何向队列中添加元素,这通常通过“入队”函数完成。此函数将...
与普通队列不同,循环队列在空间上形成一个环形结构,当队尾达到数组边界时,可以重新回到数组的起始位置,从而避免了满队列时需要创建新队列的问题。这提高了空间利用率并简化了管理过程。 在Java或Android环境中...
1. 初始化队列:创建队列时,通常将front和rear都设置为0,表示队列为空。 2. 入队(enqueue):向队列中添加新元素时,rear指针向后移动一位,然后将新元素存入对应位置。如果rear即将超出数组边界,那么它会"循环...
10. 主函数:主函数用于测试队列的各种操作,包括入队、出队、获取队头元素、获取队列长度等。 队列是一种重要的数据结构,广泛应用于计算机科学和信息技术领域。队列的操作包括入队、出队、获取队头元素、获取队列...