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 ...
随机推荐
- (剑指Offer)面试题10:二进制中1的个数
题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 很明显,这道题考察的是位运算. 1.依次将整数右移,判断整数最后一位是否为1(&1): 问题:如果该整数为负数 ...
- <The Art of Readable Code> 笔记二 (上)
第2章 封装信息到名字 (Packing information into names) 2.1 use specific words GetPage() 不如 FetchPage() 和 Dow ...
- STL栈的应用之表达式求值
#include<iostream> #include<cstring> #include<cstdio> #include<stack> using ...
- ireport制作报表pageheader只在第一页出现的解决办法
这问题居然没找到解决办法..... 好吧,那我自己解决..... 其实很简单..... 只要打开ireport,pageheader的属性,在print when expression设置$V{PAG ...
- 配置静态监听解决ORA-12514错误的案例
今天做Linux下DG配置的时候,遇到一个现象.tnsname.ora文件配置都正常,tnsping也正常,监听也正常.可是仍然报ORA-12514错误: SQL> set lin 130 pa ...
- javascript 面向对象编程(工厂模式、构造函数模式、原型模式)
javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /** * 工厂模 ...
- phpredis中文手册——《redis中文手册》 php版(转)
redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考<redis中文手册>,将示例代码用php来实现,注意php-red ...
- 【laravel54】win系下本地域名配置(解决403错误)
1.apache虚拟目录地址应该指向\laravel54\public 目录下:(TP5类似) <VirtualHost *:> DocumentRoot "D:\phpStud ...
- window下虚拟环境搭建
1.找到你的host文件
- java工具类之按对象中某属性排序
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...