数据结构, 需要考虑两个方面:

1. 每个元素具体的存储方法 (java中是一个对象)

2. 元素之间的关系如何实现存储 (java中也是一个对象)

另外在java中, 已经可以把跟数据结构有关的一些方法写到一个类里了.

线性表

顺序表

c语言: 借助数组实现

#define INIT_SIZE 100;
typedef struct {
int elem[INIT_SIZE]; // 用来存储数组元素
int length; // 当前顺序表的长度
} SqList;
// 元素之间的关系隐含在数组这种数据结构中

java语言: 也可以借用数组实现

可以直接借助 ArrayList实现.

链表

c语言:

// 结点
// 结点之间没有明确的关系, 靠一个向后的指针联系
typedef struct LNode {
int elem; // 元素
struct LNode *next; // 维系关系
} LNode, &LinkList;

java语言:

package DataSturcture;

public class LinkList<T> {

    // node object
private class Node { public Node() {}
public Node(T data, Node next){
this.data = data;
this.next = next;
}
/* private instance variable */
private T data; // element;
private Node next; // pointer, point next Node
} public LinkList() {
header = null;
tail = null;
} public LinkList(T element) {
header = new Node(element, null);
tail = header;
size++;
} public int length() {
return size;
} public T get(int index) {
return getNodeByIndex(index).data;
} private Node getNodeByIndex(int index) {
if (index < 0 || index > size -1) {
throw new IndexOutOfBoundsException("线性表索引越界");
} Node current = header;
for (int i=0; i<size && current != null; current=current.next) {
if (i == index) {
return current;
}
}
return null;
} public int locate(T element) {
Node current = header;
for (int i=0; i<size && current != null; i++, current=current.next) {
if (current.data.equals(element)) {
return i;
}
}
return -1;
} public void insert(T element, int index) {
if (index < 0 || index > size -1) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
if (header == null) {
add(element);
} else {
if (index == 0) {
addAtHeader(element);
} else {
Node prev = getNodeByIndex(index - 1);
prev.next = new Node(element, prev.next);
size++;
}
}
} public void add(T element) {
if (header == null) {
header = new Node(element, null);
} else {
Node newNode = new Node(element, null);
tail.next = newNode;
tail = newNode;
}
size++;
} public void addAtHeader(T element) {
header = new Node(element, header);
if (tail == null) {
tail = header;
}
size++;
} public T delete(int index) {
if (index < 0 || index > size -1) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
Node del = null;
if (index == 0) {
del = header;
header = header.next;
} else {
Node prev = getNodeByIndex(index - 1);
del = prev.next;
prev.next = del.next;
del.next = null;
}
size--;
return del.data;
} public T remove() {
return delete(size - 1);
} public boolean isEmpty() {
return size == 0;
} public void clear() {
header = null;
tail = null;
size = 0;
} public String toString() {
if (isEmpty()) {
return "[]";
} else {
StringBuilder sb = new StringBuilder("[");
for (Node current=header; current != null; current=current.next) {
sb.append(current.data.toString() + ", ");
}
int len = sb.length();
return sb.delete(len-2, len).append("]").toString();
}
} /* private instance variable */
private Node header; // header information
private Node tail; // tail information
private int size; // count node }

从以上的代码中, 总结几点:

1. 功能能够独立出来的函数要独立出来, 大家一起使用, 就想cs106说得一样, 画火车时, 不要着急一节一节的话, 而是先抽象出一个车厢类, 从车头到车尾的所有车厢, 都利用这个车厢类.

2. 自顶向下得设计原则贯穿始终

双向链表与上边单链表很像, 循环链表也可以利用 tail 和 header 的指向直接进行.

另外, 可以通过 线性表List, Java 的 List 接口就代表了线性表, 线性表的两种实现是 ArrayList(数组实现) 和 LinkedList, 其中 LinkedList 是一个双向链表.

对于java 而言, 如果你想使用线性表, 那么就:

顺序表: 使用 ArrayList 直接实现.

双向链表: 使用 LinkeedList 直接实现.

栈也是一种常用的数据结构, 所以java也集成了栈,

顺序栈: java.util.Stack, 普通的顺序栈, 底层是用数组实现, 这个stack是线程安全的, 在多线程环境下也可以放心使用.

链栈: java.util.LinkedList, 它不是线程安全的.

队列

Java 集合框架中提供了一个 Queue接口. 都是线程安全的.

ArrayBlockingQueue: 顺序队列

LinkedBlockingQueue: 链队列

双向队列

ArrayDeque: 代表顺序存储结构的双向队列

LinkedBlockingDeque: 代表链式存储结构的双向队列.

树和二叉树

树的父亲结点表示法

c语言实现:

/* node structure */
typedef struct TreeNode {
int elem; // 存储元素信息
int parent; // 存储 parrent 结点的指针
} TPN; /* relation ship structure */
typedef struct TreeParent {
TreeNode node[MAX_TREE_SIZE];
int r; // 根节点指针
int n; // 当前树的结点总数
}

java语言实现:

其实原理都使一样的, java通过内部类来存储单个结点, 外部类体现结点间的关系, 即数据结构.

java 基础数据结构的更多相关文章

  1. Java基础——数据结构总结

    目的 : 加强类与对象的内存分配理解,加强操作能力.理解数据结构. 结构 : 数据元素之间的关系. 数据结构 : 带有结构的数据对象. 线性结构: 各数据元素之间的逻辑以用一个线性序列简单的表达出现. ...

  2. java 基础数据结构源码详解及数据结构算法

    http://www.cnblogs.com/skywang12345/category/455711.html http://www.cnblogs.com/liqiu/p/3302607.html

  3. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  4. Java实现的基础数据结构

    Java实现的基础数据结构 0,常用的基础数据结构 图1 基础数据结构&相关特性 图2 Java自带的类集框架&继承关系图 1,数组[Array] 特点:长度固定.查找方便[直接使用i ...

  5. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  6. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  7. java之数据结构之链表及包装类、包

    链表是java中的一种常见的基础数据结构,是一种线性表,但是不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针.与线性对应的一种算法是递归算法:递归算法是一种直接或间接的调用自身算法的过 ...

  8. 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。

    来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...

  9. Java基础应用

    Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...

随机推荐

  1. 踩坑记:mysql timeStamp默认值0000-00-00 00:00:00 报错

    报错现象: 从mysql5.5数据库导出的数据结构放到mysql5.7.10 报错create_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00 ...

  2. (转)更新Java final常量后,请重新编译你的class

    程序中使用的各种常量用一个类来统一管理,类似: public class AppConst { public static final String STR_1 = "String1&quo ...

  3. Android静默安装和静默卸载代码

    静默顾名思义就是静静的默默地,静默安装和静默卸载的意思也就是说在后台默默地安装和卸载. 最近的一个app应用分发的项目中app下载的模块,下载完成之后,用户可以通过这个app进行安装,为了提高用户的体 ...

  4. SQL Server Management Studio 简单使用说明

    1.对数据库中的数据生成脚本 a.选中要生成脚本的数据库右键->任务->生成脚本(如下图)->下一步->下一步->选中你想要生成的内容->下一步->完成

  5. 表达式树ExpressionTree

    表达式树基础 转载需注明出处:http://www.cnblogs.com/tianfan/ 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要 ...

  6. Qt 5.3更新无数,更改C++控制台输出最为赞

    迁移至 多色网

  7. Spring bean三种创建方式

    spring共提供了三种实例化bean的方式:构造器实例化(全类名,反射).工厂方法(静态工厂实例化   动态工厂实例化)和FactoryBean ,下面一一详解: 1.构造器实例化 City.jav ...

  8. JDBC 事务(二)回滚到保存点

    public class SavePointTest { /**      * @param args      * @throws SQLException      */     public s ...

  9. 【CentOS6.5】MySQL安装和配置

    1./etc/my.cnf 这是mysql的主配置文件 2.数据存放位置 3.错误存放位置

  10. windows系统同时连接多个openvpn账户

    windows系统同时连接多个openvpn账户. 前提 客户端系统:Windows7 64位 OpenVPN版本:OpenVPN 2.3.10 Windows 64位 一.安装 1.安装目录 D:\ ...