`
danlei94
  • 浏览: 9522 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

数据结构----数组队列和链表的总结和心得

阅读更多

数据结构----数组队列和链表的总结和心得

 

最近一段时间,除了做一个消灭星星的小游戏外(这个在之后的博文中再提到),就一直在学习数据结构方面的知识。

小女纸在大二下学期的时候系统的学习了数据结构。自我感觉数据结构这门专业课还是比较得心应手的。在最近学习Java的过程中,又接触到了数据结构中的数组队列和链表,感觉思路还是比较清晰。下面对数组队列和链表进行总结。

 

一、数组队列

1.数组的特点:

1)<顺序存储,内存空间中的地址也是连续的

2)可以通过下标方便查找到具体的元素,但是插入和删除元素比较困难

3)长度固定,不可更改

4)类型固定

 

 

2.数组的实现方式

1)数据类型[] 数组名=new 数据类型[固定长度]:

2)数据类型[] 数组名=new 数据类型[]{1,2...}:

3)数据类型[] 数组名:

数组名=new 数据类型[固定长度]

Or 数组名=new 数据类型{1,2...}:

4)数据类型[] 数组名={1,2...}:

 

 

3.数组队列的主要思想

在一个数组长度为0的数组里,每添加一个数据,就将原来的数组指向一个新建的长度+1的新数组(这个新数组为另外开辟空间的数组。长度为原长+1.

 

二、链表

1.链表的特点:

1)内存地址不连续

2)不方便找到具体的元素(依次遍历),但是在指定元素后面插入删除很方便

3)长度不固定,任意增添删除节点

 

 

2.链表的实现方式:

1)单链表:一个数据域,一个引用域

2)双链表:一个数据域,两个个引用域(分别指前后)

3)循环链表:一个数据域,两个引用域,首尾节点相连

 

3.链表的主要思想 

通过每个节点的引用很好的找到下一个节点的数据域。添加和删除也只需改变节点引用的指向。

 

 

三、数组队列和链表的比较

前面的特点和实现分析我觉得已经很清楚了。

在这里说一点其他的。

1.如果数据经常需要用到添加或删除,最好选择--------链表

2.如果数据长度固定,且经常用到查找操作,那么最好选择---数组队列

 

个人觉得数组队列的效率非常低,每一次添加数据都会去新建一个新的数组。

但是也不排除数组队列在某些时候非常需要。因此需要综合考虑后再作出选择!

 

四、数组队列类的Java 代码(只包括添加和获取操作)

public class ArrayQueue {

 

 

private Object[] arrayqueue=new Object[0];

private int size=0;

 

 

public void add(Object obj)             //数组队列中添加结点

{

 

if(size==0)

{

size++;

arrayqueue=new Object[size];

arrayqueue[0]=obj;

}

size++;

Object[] array=new Object[size];

for(int i=0;i<size-1;i++)

array[i]=arrayqueue[i];

array[size-1]=obj;

arrayqueue=array;

}

 

 

public Object get(int index)               //获取index位置的对象

{

return arrayqueue[index];

}

 

 

public Object remove(int index)                 //删除index位置的object对象,并且返回该位置对象

{

if(index==size)

{

size--;

}

Object obj=arrayqueue[index];

for(int i=index;i<size-1;i++)

arrayqueue[i]=arrayqueue[i+1];

size--;

return obj;

 

}

public int getsize()                    //获取长度

{

return size;

}

}

 

 

五、链表类的Java代码实现(包含添加、删除、获取等操作)

 

public class LinkList {

 

private Node front;

private Node rear;

private int length=0;

public void add(Object obj)      //在链表中添加节点 传进来的是!student对象!

{

Node node=new Node(obj);

if(front==null)

{

front=node;

rear=front;

}

else

{

rear.next=node;

rear=node;

 

}

length++;

}

 

 

public Object  get(int index)                //获取index位的结点的student对象

{

if(index<0||index>length)

//System.out.println("超出范围");

throw new RuntimeException("超出范围");              //越界的一个异常提示!

 

Node node=front;

for(int i=0;i<index;i++)

node=node.next;

   return node.obj ;

}

 

public Node getNode(int index)

{

Node node=front;

for(int i=0;i<index;i++)

node=node.next;

return node;

}

 

public Object remove(int index)

{

if(index<0||index>length)

//System.out.println("超出范围");

throw new RuntimeException("超出范围");              //越界的一个异常提示!

 

Node node=front;

for(int i=0;i<index-1;i++)

node=node.next;

Node nodetemp=node.next;

node.next=nodetemp.next;

length--;

return nodetemp.obj;

}

 

 

 

 

public int remove(Object obj)                            //通过查找数据移除节点。返回删掉的节点的个数count

{

int count=0;

int i=0;

Node node=front;

while(node!=null)

{

Student stu=(Student)node.obj;

Student stu2=(Student)obj;

if(stu.getName().equals(stu2.getName())&&stu.getScore()==stu2.getScore())         //如果相等

{

count++;

 

if(i==0)                                                                                 //分类处理:与头结点相等,与尾节点相等,中间的。

{

front=node.next;

}

else if(i==length-1){

Node nodetemp=getNode(i-1);

nodetemp.next=null;

}

else{

Node nodetemp=getNode(i-1);

nodetemp.next=getNode(i+1);

}

i--;

length--;

}

node=node.next;

i++;

}

return count;

}

 

public void input(Object obj,int index)                 //在index的位置上插入一个节点

{

Node node=new Node(obj);

Node nodetemp=front;

for(int i=0;i<index-1;i++)

nodetemp=nodetemp.next;               //得到index-1位置的结点

 

node.next=nodetemp.next;                 //在index的位置插入。前后连起来

nodetemp.next=node;

 

length++;

 

 

}

 

 

public void modify(int index,Object obj)                 //修改index位置的数据域为obj

{

Node node=front;

for(int i=0;i<index;i++)

{

node=node.next;

}

node.obj=obj;

}

 

public void bianli()                                //遍历每个链表节点的数据,并打印

{

Node node=front;

((Student)(front.obj)).ToString();

for(int i=0;i<length-1;i++)

{

node=node.next;

((Student)(node.obj)).ToString();

}

}

 

public int getlength()              //获取链表的长度

{

return length;

}

 

}

<!--EndFragment-->

分享到:
评论

相关推荐

    数据结构-对应严蔚敏-吴伟民编著的数据结构, 这个是用的链表实现的线性表(仅包含 含有头结点的单链表)

    在《数据结构》一书中,作者会详细介绍链表的创建、遍历、插入、删除等操作,以及如何通过链表实现其他高级数据结构,如栈和队列。此外,还会涉及链表的优化,如使用双向链表提高某些操作的效率,或者使用循环链表...

    程序设计与数据结构-周立功

    - **数据结构**: 数据结构是指数据的组织方式,常见的数据结构包括数组、链表、栈、队列等。 - **算法**: 算法是一系列解决特定问题的指令集,好的算法能够有效地处理数据和解决问题。 #### 2. 简单类型与复合类型 ...

    java链表 个人总结

    首先,链表是一种线性数据结构,与数组不同,它的元素在内存中不是连续存储的。每个元素(称为节点)包含两部分:数据和指向下一个节点的引用。这使得链表在插入和删除操作上具有较高的效率,因为它们只需要改变节点...

    社会网络分析系统的设计和实现数据结构-课程设计学士学位论文.doc

    数据结构是计算机科学的基础,包括数组、链表、栈、队列、树、图等。这些数据结构可以用于社会网络分析系统的实现中,例如使用链表来存储社交网络中的关系,使用树来存储社交网络中的层次结构等。 3. C++编程语言的...

    数据结构实验指导书(全)

    通过这些实验,学生不仅能够掌握各种数据结构(如链表、数组、栈、队列等)的特性,还能学习到如何根据问题选择合适的数据结构,以及如何使用这些数据结构来设计和实现高效算法。实验的过程将理论与实践紧密结合,...

    数据结构实验报告-2-2-线性表(链表实现).pdf

    在这个实验报告中,我们关注的是线性表的链表实现,这是一种非常重要的数据结构,广泛应用于各种计算机算法和系统设计中。 链表与数组不同,它不连续存储元素,而是通过每个节点的指针链接相邻的元素。链表包含两种...

    考研数据结构往年试题及一些学习心得

    数据结构主要包括数组、链表、栈、队列、树(二叉树、平衡树、堆)、图等。这些基本数据结构各有特点,适用于不同的问题场景。例如,数组适合随机访问,链表便于插入和删除,栈和队列则分别用于后进先出(LIFO)和...

    队列的数据结构的学习 自我心得

    队列是一种基础且重要的数据结构,它在计算机科学和编程中扮演着不可或缺的角色。队列遵循“先进先出”(FIFO,First In First Out)的原则,也就是说,最先被添加到队列中的元素也将是最先被处理或移除的元素。这种...

    数据结构实验1_数据结构实验1_数据结构实验_

    实验的核心内容很可能是基于C++或Java等编程语言实现常见的数据结构,如线性表、栈、队列、链表、树、图以及散列表等。线性表是最基本的数据结构,可以用来存储有序或无序的数据序列。栈是一种后进先出(LIFO)的...

    数据结构课程设计的心得体会5篇 (2).docx

    - **队列**:同样是一种线性数据结构,但在两端分别进行插入和删除操作,遵循先进先出(FIFO)原则。 #### 4. **非线性数据结构** - **树**:一种非线性的数据结构,其中的节点具有层级关系。常见的树结构有二叉树...

    数据结构笔记的记录和心得

    数据结构是计算机科学中的核心概念,它涉及到如何在内存中有效地组织和管理数据,以便进行高效的操作。在学习数据结构的过程中,我们不仅需要...通过实践和总结心得,我们可以不断深化对数据结构的理解,提升编程能力。

    《B站-青岛大学-王卓老师-数据结构与算法基础》自学心得、笔记(C++语言实现).zip

    在《B站-青岛大学-王卓老师-数据结构与算法基础》的自学过程中,笔记和心得的整理至关重要,它们可以帮助你巩固所学知识,提高解决问题的能力。ljg_resource1可能是其中的资源文件,可能包含了代码示例、习题解答或...

    栈和队列的基本操作

    栈和队列是计算机科学中两个基本的数据结构,它们的基本操作包括进栈、出栈、进队、出队等。栈是一种后进先出的数据结构,即最后一个入栈的元素将是第一个出栈的元素。队列是一种先进先出的数据结构,即第一个入队的...

    数据结构栈和队列.doc

    数据结构中的栈和队列是两种非常基础且重要的抽象数据类型,...实验报告应包括详细的测试数据、实验结果以及算法的时间和空间复杂度分析,同时要求学生总结算法设计的经验和心得,以加深对数据结构的理解和应用能力。

    数据结构实验5_数据结构实验5_数据结构实验_

    通过对实验过程的反思和总结,贺欣可以更好地掌握数据结构的精髓,为未来的学习和工作打下坚实的基础。 总之,“数据结构实验5”是一个综合性的实践教学环节,通过亲自动手编程和分析,学生能够加深对数据结构的...

    数据结构实验指导书(C++)- 栈、队列、串的操作.docx

    在本实验中,我们将深入探讨数据结构中的三个基本概念:栈、队列和串,以及它们在C++中的实现。这些数据结构是计算机科学中处理和组织数据的基础,广泛应用于各种算法和程序设计中。 首先,栈是一种后进先出(LIFO...

    数据结构实验指导书(C++)- 栈、队列、串的操作.pdf

    同时,记录程序清单、调试过程,分享设计技巧和心得体会,这对于深化理解数据结构的内在逻辑至关重要。 通过这个实验,学生不仅能掌握栈、队列、串的基本操作,还能锻炼C++编程能力,以及问题解决和调试技巧。这...

    数据结构复习总结心得最终版.pdf

    本复习总结涵盖了数据结构的基础知识,主要针对研究生考研复习,特别是408计算机考研大纲的要求。 首先,第一章绪论讨论了不同类型的存储结构。顺序存储是最简单的形式,元素在内存中连续存放,便于随机访问,但...

Global site tag (gtag.js) - Google Analytics