TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
数据结构中的线性表,对应着Collection中的List接口。
在本节中,我们将做以下三件事
第一:我们先来看看线性表的特征
第二:自己用java实现List
第三:对比的线性表、链式表性能,以及自己的List性能与JDKList性能对比 线性表特征:
第一:
一个特定的线性表,应该是用来存放特定的某一个类型的元素的(元素的“同一性”)
第二:
除第一个元素外,其他每一个元素有且仅有一个直接前驱;除最后一个元素外,其他每一个元素有且仅有一个直接后继(元素的“序偶性”)
第三:
元素在线性表中的“下标”唯一地确定该元素在表中的相对位置(元素的“索引性”)
又:
一.线性表只是数据的一种逻辑结构,其具体存储结构可以为顺序存储结构和链式储存结构来完成,对应可以得到顺序表和链表。 二.对线性表的入表和出表顺序做一定的限定,可以得到特殊的线性表,栈(FILO)和队列(FIFO) (1)自己实现线性表之顺序表
思路: 1. 顺序表因为采用顺序存储形式,所以内部使用数组来存储数据
2.因为存储的具体对象类型不一定,所以采用泛型操作
3.数组操作优点:
1.通过指针快速定位到下表,查询快速 缺点:
1.数组声明时即需要确定数组大小。当操作中超过容量时,则需要重新声明数组,并且复制当前所有数据 2.当需要在中间进行插入或者删除时,则需要移动大量元素(size-index个) 具体实现代码如下:
(2)自己实现线性表之链表 思路:1.链表采用链式存储结构,在内部只需要将一个一个结点链接起来。(每个结点中有关于此结点下一个结点的引用) 链表操作优点:1.,因为每个结点记录下个结点的引用,则在进行插入和删除操作时,只需要改变对应下标下结点的引用即可 缺点:1.要得到某个下标的数据,不能通过下标直接得到,需要遍历整个链表
实现代码如下:(3)自己实现线性表之栈
栈是限定仅允许在表的同一端(通常为“表尾”)进行插入或删除操作的线性表。
允许插入和删除的一端称为栈顶(top),另一端称为栈底(base)
特点:后进先出 (LIFO)或,先进后出(FILO)
因为栈是限定线的线性表,所以,我们可以调用前面两种线性表,只需要对出栈和入栈操作进行设定即可 具体实现代码
- /**
- * 自己用数组实现的栈
- */
- public class ArrayStack< E> {
- private ArrayList< E> list=new ArrayList< E>();//用来保存数据线性表
- private int size;//表示当前栈元素个数
- /**
- * 入栈操作
- * @param e
- */
- public void push(E e){
- list.add(e);
- size++;
- }
-
- /**
- * 出栈操作
- * @return
- */
- public E pop(){
- E e= (E)list.get(size-1);
- size--;
- return e;
- }
- }
复制代码 至于用链表实现栈,则只需要把保存数据的顺序表改成链表即可,此处就不给出代码了 (4)自己实现线性表之队列 与栈类似
队列是只允许在表的一端进行插入,而在另一端删除元素的线性表。
在队列中,允许插入的一端叫队尾(rear),允许删除的一端称为队头(front)。
特点:先进先出 (FIFO)、后进后出 (LILO) 同理,我们也可以调用前面两种线性表,只需要对队列的入队和出队方式进行处理即可
- /**
- * 用数组实现的队列
- */
- public class ArrayQueue< E> {
- private ArrayList< E> list = new ArrayList< E>();// 用来保存数据的队列
- private int size;// 表示当前元素个数
-
- /**
- * 入队
- * @param e
- */
- public void EnQueue(E e) {
- list.add(e);
- size++;
- }
-
- /**
- * 出队
- * @return
- */
- public E DeQueue() {
- if (size > 0) {
- E e = list.get(0);
- list.delete(0);
- return e;
- }else{
- throw new RuntimeException("已经到达队列顶部");
- }
- }
- }
复制代码 (5)对比线性表和链式表
前面已经说过顺序表和链式表各自的特点,这里在重申一遍
数组操作
优点:1.通过指针快速定位到下标,查询快速 缺点:1.数组声明时即需要确定数组大小。当操作中超过容量时,则需要重新声明数组,并且复制当前所有数据 2.当需要在中间进行插入或者删除时,则需要移动大量元素(size-index个) 链表操作
优点:1.,因为每个结点记录下个结点的引用,则在进行插入和删除操作时,只需要改变对应下标下结点的引用即可 缺点:1.要得到某个下标的数据,不能通过下标直接得到,需要遍历整个链表。 改进:
链表中我们每次添加一个数据时,都需要遍历整个表,得到表尾,再在表尾添加,这是很不科学的 现改进如下:设立一个Node
类的成员变量last来指示表尾,这样每次添加时,就不需要再重新遍历得到表尾,改进后add()方法如下
- public boolean add(E e) {
- if (size == 0) {
- header.e = e;
- } else {
- // 根据需要添加的内容,封装为结点
- Node< E> newNode = new Node< E>(e);
- //在表尾添加元素
- last.addNext(newNode);
- //将表尾指向当前最后一个元素
- last = newNode;
- }
- size++;// 当前大小自增加1
- return true;
- }
复制代码
源码下载:http://file.javaxxz.com/2014/11/30/000650046.zip |
|