前言:

数据结构和算法是程序员的内功心法和基本功。无论是Java还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少!

数据结构是计算机存储、组织数据的方式,同时也泛指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的算法执行或是数据存储效率。数据结构往往同高效的算法和索引技术有很强的关联性和依赖性。

在计算机程序设计中,我们可以用数据结构来表示特定的对象数据,这些数据往往多样化的且拥有不同的数据结构,诸如数组、借口、类和枚举等等。不同的数据结构所采用的处理方法不同,计算复杂度也不同,因此,算法往往依赖于基础。难怪计算机科学家尼古拉斯沃斯(Nicklaus Wirth)提出了公式“算法+数据结构=程序”,化繁为简地展示出了计算机程序的本质。对初学者来讲,仅仅依靠观察这个公式,我们也会发现数据结构算法一定是如影相随难分难舍的。

数据结构定义

随着计算机科学与技术的飞速发展,计算机的应用领域已不再局限于科学计算,而更多应用于控制、管理、生活和娱乐等非数值处理领域。与此相应,计算机程序处理的数据也由纯粹的数值扩充到字符、表格、图形、图表、图像、声音、位置等等,且数据量也越来越大,数据处理频次也越来越高。

由此可见,数据结构起源于计算机程序设计,并随之发展而发展,它们互为伴生物。虽然当下各种计算机以及程序已是家喻户晓触手可用,但遗憾的是,迄今为止,数据结构在业界还没有一个统一的定义,不同的专家,对数据结构有不同的阐述。但根据不同专家的阐述,重点关注如下:数据的逻辑结构,数据的物理存储,数据的运算。

另外,数据结构不但是一切算法的基础,而且还是程序设计语言的基础。诸如Java,C++,C,C#,Python等等,其语言特性都是建立在一定的数据结构之上。因此,深入学习数据结构,也是掌握语言特性并能够高效解决实际程序设计问题的正确开始。

数据结构的基本概念

  • 数据(Data)
  • 数据元素(Data Element)
  • 数据结构(Data Structure)

数据结构的内容

  • 数据的逻辑结构
  • 数据的存储结构
  • 数据的运算

数据结构的分类

  • 线性结构
    数组、队列、链表、栈
  • 非线性结构

       树、图、堆、散列表

数据结构的存储方式

  • 顺序存储方式
  • 链接存储方式
  • 索引存储方式
  • 散列存储方式

线性表、顺序表和链表介绍

线性表

线性表(list):零个或多个数据元素的有限序列。

所谓的线性表,就是将数据排成像一条长线一样的结构,数组,链表,栈,队列都是线性表结构,线性表上的每个数据最多只有前后两个方向,下面以一幅图的形式来展现一下线性表结构

Java 数据结构对比 java与数据结构有什么联系_java 数据结构

与这种线性结构对应的就是非线性结构,比如后续要学习的数,堆,图等,在这些非线性数据结构中,数据之间并不是简单的前后关系,如下图:

Java 数据结构对比 java与数据结构有什么联系_java数据结构_02

  • 线性表:逻辑结构, 就是对外暴露数据之间的关系,不关心底层如何实现。
  • 顺序表、链表:物理结构,他是实现一个结构实际物理地址上的结构。比如顺序表就是用数组实现。而链表用指针完成主要工作。不同的结构在不同的场景有不同的区别。
  • 对于java来说,大家都知道List接口类型,这就是逻辑结构,因为他就是封装了一个线性关系的一系列方法和数据。而具体的实现其实就是跟物理结构相关的内容。比如顺序表的内容存储使用数组的,然后一个get,set,add方法都要基于数组来完成,而链表是基于指针的。当我们考虑对象中的数据关系就要考虑指针的属性。指针的指向和value。

线性表、顺序表和链表之间的区别和联系

Java 数据结构对比 java与数据结构有什么联系_java数据结构与算法分析3 代码_03

线性表基本架构

  • 对于一个线性表来说。不管它的具体实现方法如何,我们应该有的函数名称和实现效果应该一致。你也可以感觉的到在一些结构的设计。比如List的Arraylist和LinkedList。Map的HashMap和currentHashMap他们的接口api都是相同的,但是底层设计实现肯定是有区别的。
  • 所以,基于面向对象的编程思维,我们可以将线性表写成一个接口,而具体实现的顺序表和链表可以继承这个接口的方法,提高程序的可读性。
  • 还有一点比较重要的,记得初学数据结构与算法时候实现的线性表都是固定类型(int),随着知识的进步,我们应当采用泛型来实现更合理。至于接口的具体设计如下:
package LinerList;
public interface ListInterface {	
	void Init(int initsize);//初始化表
	int length();
	boolean isEmpty();//是否为空
	int ElemIndex(T t);//找到编号
	T getElem(int index) throws Exception;//根据index获取数据
	void add(int index,T t) throws Exception;//根据index插入数据
	void delete(int index) throws Exception;
	void add(T t) throws Exception;//尾部插入
	void set(int index,T t) throws Exception;
	String toString();//转成String输出	
}