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 ... 
