赞
踩
本人是一名出于兴趣的计算机爱好者,水品严重有限,有错误大家请了当指出,在下抱拳拱手以迎。
什么是数据结构,就是存储数据的一种手段,什么是程序程序就是算法和数据结构,其实程序只是处理数据,存储数据的方法是程序,但程序只加工数据,例如定义数据的存储结构,定义数据的使用方法。
数组是数据结构,但也可不用数组,我用变量也可以做到同样的效果,反正就是把数据存到内存上,我用变量存,和你用数组存都是一样的,但当数据多了就有问题了,比如存一百整数,我可以用100个变量存,但100个名字管理起来已经比100个数据还复杂了
,那我们把名字抹掉用索引,数组诞生,我讨厌数组的大块内存,我要把小块内存串起来,用一个分配一个,链表诞生。数据结构其实还可以叫做,数据存储的小方法更贴切一点,用最基本的数组和节点去构建一个庞大数据的存储方式,当然还有使用方法,如果只存不使用好像也没什么意义。
环境 : Ubuntu 18.04.1 LTS + eclipse + JSE-10 。都是2018很新的软件,本项目eclipse导出项目源码百度网盘地址如下:https://pan.baidu.com/s/1ElG7VBsGAgvJZqcafLtu7w 任何问题请留言,或发送到邮箱gdYGDX@163.com
本篇内容:采用一站到底的方法,一篇博客把数组链表都实现一遍,然后再把栈和队列再都实现一遍,注意下面几点。
1.关于泛型的使用:泛型用起来很装逼其实什么屌用都没有请记住它只是编译的时候检查一下,后期运行时候都是被当成Object处理,但是好歹我们也是个实现,写的太low也不好交代,也不利于大家学习,所以我们逼格高一点,就搞个类库风格的数据结构只是前面都加了一个My单词,JDK有ArrayList 我们就搞一个MyArray,同时会有和JDK ArrayList的一些对比,JDK写的也不是太流弊,就是两点流弊,第一点:效率,同样的效果,人家知道整么写跑的快,这就流弊之一不得不服,第二:人家全局观吊环环相扣把面向对象耍的666,这是流弊之二不得不服。
2.链表是双向链表,保证是最奇怪的链表实现,因为完全是我自己想出来的就是为了好玩,当然也有一定的效果,我还想过球形链表把链表绕成一个球,然后有一个球心,球心还可以连接其它的球,后来搞得乱七八糟没任何意义,一个嵌套链表就搞定了,一个嵌套链表不行,那就再嵌套一个链表,不过嵌套到最后自己就不知道是什么鬼了。
3.工具类Tool.java 是模仿java编程思想写的一个工具类,println()方法等价与System.out.println()目的就是少打几个单词,看起来更美丽一点。好让我们进入代码的世界吧。
首先是Tool的源码,所有的其他类都静态引入了这个类,静态引入很爽只要你的方法是静态不用实例化也不用类名直接就可以调用了。
- package dome.gaoxiaoming;
-
- public class Tool {
- public static void println() {
- System.out.println();
- }
- public static void println(Object obj) {
- System.out.println(obj);
- }
- public static void hr() {
- Tool.println();
- Tool.println("...................................................");
- }
- public static void hr(int how_long) {
- Tool.println();
- for(int i =0;i<how_long;i++) {
- Tool.print(".");
- }
- Tool.println();
- }
- public static void print() {
- System.out.print(" ");
- }
- public static void print(Object obj) {
- System.out.print(obj);
- }
-
- }
这些方法,90%都用不到,就天天只用到了一个println方法,那个hr()是打印华丽分割线,我后来想过获取终端长度然后我就可以打印一条和终端一样长的线了,后来在stackOverflow上找到了一个兄弟写的代码,他用OS的shell命令来获取终端的长度比如在linux 终端下输入tput cols 就和显示你的终端有多少列,列是竖着的也就是一行可以输入多少字符,tput lines 获取行数。
没想到的是eclipse下对终端进行了重定向,我也不知道是怎么从定向的,大概应该把系统的标准输入流定向到eclipse的终端,很像linux里的管道例如 ls | grep linux ,把ls的输出传给grep ,grep再查找有没有叫linux的,但重定向后问题就出来,那就是终端的信息丢失,传递的只有数据没有终端的描述,所以上面那个兄弟的代码在终端中可以用在eclipse终端下就无用,同理还有终端的密码输入不回显示方法在eclipse终端下也无法使用,说以我们就叫eclipse下的终端为太监终端。因为它被阉割了。关于那个StackOverflow兄弟的代码在项目里有名字叫做GetScreen.java顺手给大家。
开始正题 : 下面用数组实现java的ArrayList
- package dome.gaoxiaoming;
- /*
- * 表的数组实现,非末尾的插入删除都是 O(N^2) 所以效率很低,但是用下表擦找和遍历全
- * 表比链表操作要快,这也是数组的访问优势吧。
- */
- import static dome.gaoxiaoming.Tool.*;
- import java.util.Iterator;
- //泛型是为了提供检查机制,实现Iterable接口是为了使用forEach循环
- public class MyArray<AnyType> implements Iterable<AnyType> {
- /*
- * 用到的一些变量
- */
- private AnyType array[];
- private int size;
- private int DEFAULT_CAPACITY=10; //测试环境为10,实际使用建议调成100
- private float f_size,gxm_i=1,gxm_j=10; //这个跟自己的gxmSize方法有关,暂时可以忽略
- @SuppressWarnings("unchecked") //忽略警告,下同
- public MyArray() {
- size=0;
- array = (AnyType[]) new Object[DEFAULT_CAPACITY];
- }
- public int getSize() {
- return size;
- }
- public int getCapacity() {
- return array.length;
- }
-
- @SuppressWarnings("unchecked")
- private void ensureCapacity(int newCapacity
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。