数据结构的分类:

线性结构

数组;栈;队列;链表;哈希表;。。。

树结构

二叉树;二分查找树;AVL;红黑树;Treap;Splay;堆;栈;Trie;线段树;K-D树;并查集;哈夫曼                树;。。。

图结构

邻接矩阵;邻接表;。。。

对于数据结构的重要性,自然不必多说,直接开始学习!

数组

基础:把数据码成一排进行存放。

public class ArrayBasic {
public static void main(String[] args) {
int[] arr = new int[10]; // for (int i = 0; i < arr.length; i++) {
// arr[i] = i;
// } int[] score = new int[]{100,66,99};
for (int i = 0; i < score.length; i++) {
System.out.println(score[i]);
} for (int i : score) {
System.out.println(i);
} score[0] = 98; for (int i : score) {
System.out.println(i);
} } }

这是一个最基础的对于数组的代码演示。

其中数组的索引既可以有语意,也可以没语义。

数组最大的好处:快速查询,数组最好应用有语义的索引,但并非所有有语义的索引都适用于数组。

索引没有语义,如何表示没有元素?

如何添加元素?如何删除元素?

基于Java的数组,二次封装属于我们自己的数组类。

public class Array {

    private int[] data;

    private int size;

    //有参构造
public Array(int capacity) { data = new int[capacity];
size = 0;
} //无参构造
public Array() {
this(10);
} //获取大小
public int getSize() {
return size;
} //获取容量大小
public int capacity() {
return data.length;
} //判断是否为空
public boolean isEmpty() {
return size == 0;
} }

这里我们就基本搭建了一个最基础的数组。接下来我们就为这个数组添加元素。

public void addLast(int e) {
if (size == data.length) {
throw new IllegalArgumentException("AddLast is full!");
} data[size] = e;
size++;
}

在处理如果数组无法容纳时,我们抛了一个异常,之后我们可以用另外的法方法解决这个问题。

难度加大,我们想要对这个数组进行指定位置的插入,从而使得这个数组是一个有序数组,那么我我们该怎么办呢?

从最后一个开始遍历 注意向前寻找,找到后,在索引处之后的元素都向后退一格,之后覆盖掉原本所引的数据。

public void add(int index, int e) {
if (size == data.length) {
throw new IllegalArgumentException("AddLast is full!");
}
if (index < 0 || index > size) {
throw new IllegalArgumentException("require index >= 0 and index > size!");
} for (int i = size - 1; i >= size; i--) {
data[i + 1] = data[i];
}
data[index] = e;
size++;
}

这个时候,我们发现可以复用addLast代码 在addLast方法中直接调用add方法即可,同理还可以造出一个addFrist方法。

之后我们在数组中完成查询元素和修改元素

@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array:size=%d,capacity=%d\n",size,data.length));
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if(i != size-1){
res.append(",");
}
res.append(']'); }
return res.toString();
} //获取索引index位置的函数
public int get(int index){
if(index < 0||index>size){
throw new IllegalArgumentException("index is illegal");
}
return data[index];//保护了data
} //设置index的数据
public void set(int index,int e){
if(index < 0||index>size){
throw new IllegalArgumentException("index is illegal");
}
data[index] = e;
}

数组中的包含,搜索和删除数据

//查看数组中是否包含元素
public boolean contains(int e){
for (int i = 0; i < size; i++) {
if(data[i] == e){
return true;
}
}
return false;
}
//查看数组中所在元素的索引
//如果索引未找到,则返回-1
public int find(int e){
for (int i = 0; i < size; i++) {
if(data[i] == e){
return i;
}
}
return -1;
}
//从数组中删除指定索引的元素
public int remove(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("require index >= 0 and index > size!");
}
int ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
return ret;
} //从数组中删除最后一个元素
public int removeLast(int index){
return remove(size-1);
}
//从数组中删除元素
public void removeElement(int e){
int index = find(e);
if(index != -1) {
remove(index);
}
}

到这里,我们已经写了非常多的关于数组的方法。

但是我们可以发现,现在我们自己写的数组只可以完成一种数据类型的支持,我们需要用到泛型来进行数组内容的扩

撑,不仅仅是Java自己的数据类型,还应该去支持用户自己生成的数据类型。

但是,当我们使用泛型后,就不可以存放那基础的八种数据类型,只能存放类对象,那样的话就太不方便了,针对这

个问题,Java引出了包装类,使得解决。

public class Array<E> {

    private E[] data;

    private int size;

    //有参构造
public Array(int capacity) { data = (E[]) new Object[capacity];
size = 0;
} //无参构造
public Array() {
this(10);
} //获取元素的个数
public int getSize() {
return size;
} //获取容量大小
public int capacity() {
return data.length;
} //判断是否为空
public boolean isEmpty() {
return size == 0;
} //获取索引index位置的函数
public E get(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("index is illegal");
}
return data[index];//保护了data
} //设置index的数据
public void set(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("index is illegal");
}
data[index] = e;
} //在末尾加入数据
public void addLast(E e) {
// if (size == data.length) {
// throw new IllegalArgumentException("AddLast is full!");
// }
//
// data[size] = e;
// size++;
add(size, e);
} public void addFirst(E e) {
add(0, e);
} //在数组中指定位置加入
//从后加入
public void add(int index, E e) {
if (size == data.length) {
throw new IllegalArgumentException("AddLast is full!");
}
if (index < 0 || index > size) {
throw new IllegalArgumentException("require index >= 0 and index > size!");
} for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
data[index] = e;
size++;
} //查看数组中是否包含元素
public boolean contains(E e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e)) {
return true;
}
}
return false;
} //查看数组中所在元素的索引
//如果索引未找到,则返回-1
public int find(E e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e)) {
return i;
}
}
return -1;
}
//从数组中删除指定索引的元素
public E remove(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("require index >= 0 and index > size!");
}
E ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
data[size] = null; // loitering Objects != memory leak
return ret;
}
//从数组中删除最后一个元素
public E removeLast(){
return remove(size-1);
}
//从数组中删除第一个元素
public void removeFirst(){
remove(0);
}
//从数组中删除元素
public void removeElement(E e){
int index = find(e);
if(index != -1) {
remove(index);
}
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array:size=%d,capacity=%d\n", size, data.length));
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if (i != size - 1) {
res.append(",");
}
}
res.append(']');
return res.toString();
}
}

至此,我们就完成所有关于静态数组的相关操作今天把所有数组里的操作做了出来。明天我们将研究如何写出动态数组,也就是数组可以进行扩容的问题。

学习数据结构Day1的更多相关文章

  1. Spark菜鸟学习营Day1 从Java到RDD编程

    Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...

  2. SqList *L 和 SqList * &L的区别/学习数据结构突然发现不太懂 小祥我查找总结了一下

    小祥在学习李春葆的数据结构教程时发现一个小问题,建立顺序表和输出线性表,这两个函数的形参是不一样的. 代码在这里↓↓↓ //定义顺序表L的结构体 typedef struct { Elemtype d ...

  3. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  4. OpenCV图像处理学习笔记-Day1

    OpenCV图像处理学习笔记-Day1 目录 OpenCV图像处理学习笔记-Day1 第1课:图像读入.显示和保存 1. 读入图像 2. 显示图像 3. 保存图像 第2课:图像处理入门基础 1. 基本 ...

  5. 数据结构之Queue | 让我们一块来学习数据结构

    前面的两篇文章分别介绍了List和Stack,下面让我们一起来学习Queue 数据结构之List | 让我们一块来学习数据结构 数据结构之Stack | 让我们一块来学习数据结构 队列的概况 队列是一 ...

  6. 数据结构之LinkedList | 让我们一块来学习数据结构

    highlight: monokai theme: vue-pro 上一篇文章中使用列表(List)对数据排序,当时底层储存数据的数据结构是数组.本文将讨论另外一种列表:链表.我们会解释为什么有时链表 ...

  7. 数据结构之Set | 让我们一块来学习数据结构

    数组(列表).栈.队列和链表这些顺序数据结构对你来说应该不陌生了.现在我们要学习集合,这是一种不允许值重复的顺序数据结构.我们将要学到如何创建集合这种数据结构,如何添加和移除值,如何搜索值是否存在.你 ...

  8. 清北学堂学习总结 day1 数据结构 练习

    1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Maste ...

  9. Python学习路程day1

    变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...

随机推荐

  1. 74HC595 8位移位寄存器的使用小结

    请查看我的博客园文章,比较详细. https://www.cnblogs.com/CodeWorkerLiMing/p/11964258.html

  2. BZOJ 4500: 矩阵 带权并查集

    这个思路挺巧妙的 ~ 定义一行/列的权值为操作后所整体增加的值. 那么,我们会有若干个 $a[x]+b[y]=c$ 的限制条件. 但是呢,我们发现符号是不能限制我们的(因为可加可减) 所以可以将限制条 ...

  3. .net core 原生支持grpc

    文章转自:https://grpc.io/blog/grpc-on-dotnetcore This is a guest post by Sourabh Shirhatti, a Program Ma ...

  4. 【CF1042F】Leaf Sets

    [CF1042F]Leaf Sets 题面 洛谷 题解 对于一个根节点\(x\),考虑其子树内的所有\(lca\)为它的叶子节点到它的距离\(d_1<d2<...<d_m\). 那么 ...

  5. shell for 循环演示

    test.sh #!/bin/bash for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script&qu ...

  6. MySQL 是如何利用索引的

    阅读本文大概需要 4 分钟. 一.前言 在 MySQL 中进行 SQL 优化的时候,经常会在一些情况下,对 MySQL 能否利用索引有一些迷惑.例如: MySQL 在遇到范围查询条件的时候就停止匹配了 ...

  7. 如何使用gitbook写文档

    本文主要参考资料为该网址:https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md 如何想使用现成的gitbook,网络上虽说可以搜 ...

  8. Gevent简明教程

    Gevent简明教程  发表于 2015-11-28 |  分类于 技术| |  阅读次数 5159 前述 进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程.多线程.协程和异步. 多 ...

  9. Python数据分析学习(一)

    转摘:https://segmentfault.com/a/1190000015440560 一.数据初探 首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seabor ...

  10. Refused to execute script from '...' because its MIME type ('') is not executable, and strict MIME type checking is enabled.

    写在前面 部署项目到weblogic上启动首页访问空白, 浏览器控制台报如题错误. web.xml中把响应头添加防止攻击的报文过滤器禁用就行了(仅仅是为了启动), 以下为转载内容, 可以根据需要自行测 ...