java 基础数据结构
数据结构, 需要考虑两个方面:
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 基础数据结构的更多相关文章
- Java基础——数据结构总结
目的 : 加强类与对象的内存分配理解,加强操作能力.理解数据结构. 结构 : 数据元素之间的关系. 数据结构 : 带有结构的数据对象. 线性结构: 各数据元素之间的逻辑以用一个线性序列简单的表达出现. ...
- java 基础数据结构源码详解及数据结构算法
http://www.cnblogs.com/skywang12345/category/455711.html http://www.cnblogs.com/liqiu/p/3302607.html
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java实现的基础数据结构
Java实现的基础数据结构 0,常用的基础数据结构 图1 基础数据结构&相关特性 图2 Java自带的类集框架&继承关系图 1,数组[Array] 特点:长度固定.查找方便[直接使用i ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- java之数据结构之链表及包装类、包
链表是java中的一种常见的基础数据结构,是一种线性表,但是不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针.与线性对应的一种算法是递归算法:递归算法是一种直接或间接的调用自身算法的过 ...
- 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。
来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...
- Java基础应用
Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...
随机推荐
- PHP快速入门 如何导入网站模板
1 把前面的Guest网站复制到www目录下 2 在地址栏敲http://localhost:8080/guest/ 进入该网站,发现没有导入数据库 3 新建一个标签,在地址栏输入http://loc ...
- angularjs中ng-repeat的使用
第一个例子:使用ng-repeat最简单的例子 <html ng-app="myApp"> <head> <title>angularjs-de ...
- 【转】Linux下的多线程编程背景知识
1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...
- 算法笔记_134:字符串编辑距离(Java)
目录 1 问题描述 2 解决方案 1 问题描述 给定一个源串和目标串,能够进行如下操作: 在任意位置上插入一个字符: 替换掉任意字符: 删除任意字符. 写一个程序,实现返回最小操作次数,使得对源串 ...
- QtGui.QProgressBar
A progress bar is a widget that is used when we process lengthy tasks. It is animated so that the us ...
- 正确用DD测试磁盘读写速度
转自:http://blogread.cn/it/article/6479?f=wb 问: 以下几种方式测试磁盘读写速度有什么区别? dd bs=1M count=128 if=/dev/zero o ...
- web前端开发文档
- linux 下处理大文件
.head tail more .先把大文件进行分割 split split 参数: -a, --suffix-length=N 指定输出文件名的后缀,默认为2个 -b, --bytes=SIZE 指 ...
- Spring @Autowired、@Resource、@Required、@Component、@Repository、@Service、@Controller注解的用法和作用
Spring @Autowired,@Resource,@Required注解的用法和作用 Spring中 @Autowired标签与 @Resource标签 的区别 Spring注解@Compone ...
- 【linux】Linux查看各类日志
Log位置: /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日志信息 /var/log/ma ...