数据结构从零开始

一、绪论

1.1 时间复杂度和空间复杂度

算法时间复杂度:算法中基本操作的执行次数

常用时间复杂度的比较关系:在这里插入图片描述
算法空间复杂度:算法在运行时所需存储空间

1.2 数据结构基本概念

(1)数据
(2)数据元素:数据的基本单位,可有若干数据项组成
(3)数据项:最基础、不可分的最小数据单位
(4)数据对象:性质相同的数据对象的集合,数据的一个子集
(5)数据结构:相互之间存在一种或多种特定关系的数据元素的集合,包括三个方面:逻辑结构、存储结构和对数据的运算
(6)逻辑结构:分为线性结构和非线性结构
(7)物理结构:又称为存储结构,是数据的逻辑结构在计算机中的表示(又称映像)
顺序存储:通常是数组实现
链式存储
索引存储:索引表<关键字,地址>
散列存储:根据结点的关键字通过散列函数计算出存储地址,本质是顺序存储的扩展

二、线性表

2.1 线性表的基本概念和实现

2.1.1 定义

线性表是具有相同特性数据元素的一个有限序列。

2.1.2 逻辑特性

只有一个表头元素,只有一个表尾元素,表头元素没有前驱,表尾元素没有后继,除表头和表尾元素之外,其他元素只有一个直接前驱,也只有一个直接后继。

2.1.3 存储结构

分为顺序表和链表
(1)顺序表:存储空间连续
(2)链表:在链表存储中,每个结点不仅包含所存元素的信息,还包含元素之间逻辑关系的信息
链表形式:
 1)单链表:
 带头结点的单链表中,头指针head指向头结点,头结点的存储数据信息,从头结点的后继结点开始存储数据信息,

	ListNode newNode = new ListNode(-1);//java带头结点声明方式

 不帯头结点的单链表中的头指针head直接指向开始结点
 2)双链表:在单链表的结点上添加一个指针指向前驱结点
 3)循环单链表:将单链表的最后一个指针域(空指针)指向链表的第一个结点即可(这里之所以说第一个结点而不说是头结点是因为,如果循环单链表是带头结点的,最后一个结点的指针域要指向头结点:如果循环单链表不带头结点,则最后一个指针域指向开始结点
 4)循环双链表
 5)静态链表
在这里插入图片描述

一般链表结点空间来自于整个内存,静态链表则来自于一个结构体数组。数组中的每一个结点含有两个分量:一个是数据元素分量data:另一个是指针分量,指示了当前结点的直接后继结点在数组中的位置(这和一般链表中next指针的地位是同等的)。
注意:静态链表中的指针不是通常所说的C语言中用来存储内存地址的指针型变量,而是一个存储数組下标的整型变量,通过它可以找到后继結点在数组中的位置,其功能类似于真实的指针。

(3)顺序表与链表比较:
 顺序表:随机访问特性,存储空间连续,一次性分配存储空间,插入/删除需要移动多个元素(平均为长度的一半);
 链表:不支持随机访问,存储指针使存储空间利用率稍低,支持动态分配,插入/删除不需要移动元素;

2.2 线性表的基本操作

2.2.1 顺序表

(1)按元素值的查找算法
在顺序表中査找第一个值等于e的元素,并返回其下标;
(2)插入数据元素的算法
在顺序表L的第p个位置上插入新的元素e。

2.2.2 单链表

(1)头插法、尾插法建立链表
(2)单链表的归并操作:将两个递增有序的链表合并为一个按元素值非递减有序的链表

2.2.3 双链表

(1)尾插法建立双链表(r是尾结点指针,s是新增结点:r->next = s, s->prior = r, r = s)
(2)查找结点
(3)插入/删除结点(p结点后插入s)
在这里插入图片描述

2.2.2 循环链表

三、栈和队列

3.1 基本概念

3.1.1 栈

定义:一种只能在一端进行插入或删除操作的线性表。栈顶、栈底、入栈、出栈
特点: 先进后出(FILO)
存储结构:顺序栈、链式栈

3.1.2 队列

定义:队列简称队,仅允许在表的一端进行插入,在表的另一端进行删除,可进行插入的一端称为队尾(Rear),可进行删除一端称为对头(Front)。进队、出队
特点: 先进先出(FIFO)
存储结构:顺序队、链队

3.2 存储结构、算法与应用

3.2.1 顺序栈

在这里插入图片描述
(1)栈空、栈满、上溢(栈满继续入栈)和下溢(栈空继续出栈)
(2)进栈、出栈:需要注意是先移动栈顶指针还是先移动元素(若栈空top=-1,进栈先移动指针,-1下标不可存元素)

3.2.2 链栈

(1)栈空(lst->next==NULL)、栈满(无内存限制时不存在)
(2)进栈、出栈

3.2.3 顺序队

(1)循环队列:假溢出 front = (front + 1)%maxSize
  队空、队满、进队、出队
(2)应用:初始化、判断队空、进队、出队

3.2.4 链队

(1)队空、队满:不考虑内存就无队满上溢情况
(2)进队、出队
(3)应用:
初始化:lqu -> front = lqu -> rear = NULL
判断队空: lqu -> front == NULL || lqu -> rear == NULL
入队:
在这里插入图片描述

出队:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值