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 ...
随机推荐
- WEB打印控件Lodop(V6.x)使用说明及样例
WEB打印控件Lodop(V6.x)使用说明及样例 Lodop是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码生成复杂打印页. 控件功能强大,却简单易用,所有调用如同JavaScript扩展 ...
- angular中定义全局变量及全局变量的使用
一个例子,定义了两个变量,并且把变量显示出来: <!DOCTYPE html> <html ng-app="myApp"> <head> < ...
- Onvif鉴权实现方式
Onvif鉴权实现方式 Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) ) gsoap中digest生成代码: int ...
- 安装TeX及中文支持
2014.7.19更新: 以下的笔记适用于在基于Ubuntu的发行版(比方LinuxMint)安装Texlive2013.2014: 第一步依据本机状况.可能不须要. Texlive2014已经能够下 ...
- 算法笔记_151:算法提高 01背包(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入格式 输入的第 ...
- Flume入门:安装、部署
一.什么是Flume? flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original genera ...
- jquery导航,按钮等特效 - apycom
http://apycom.com/
- Timer Schedule参数说明
Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次. TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务. schedule的意 ...
- 公有/私有/保护继承、overload/overwrite/override之间的区别
一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...
- sql2008拒绝了对对象 (数据库 ,架构'dbo')的SELECT权限
连接sql2008的时候,出现了这种一直报权限错误:错误截图如下: 所见效果描述:在windows身份验证的 情况下登陆进去数据库的表都是可以打开的,当换到sa或者别的账号登陆进去的时候这个时候我们点 ...