数据结构 浙大MOOC 笔记二 线性结构
线性表及其表现
第二章的内容是关于三种最基本的数据结构 结合《DDSA》第三章 表、栈和队列做一个总结
首先简单说明一下各个数据结构的特点:
数组:连续存储,遍历快且方便,长度固定,缺点是删除和添加数据需要移动(1,n)个数据,时间复杂度高
链表:离散存储,添加和删除方便,空间和时间消耗大,双向链表比单向的灵活,但是空间耗费也更大
Hash表:数据离散存储,利用hash 算法决定存储位置,遍历比较麻烦。
二叉树: 一般的查找遍历,有深度优先和广度优先两种,遍历分前序、中序、后序遍历,效率都差不多。但是如果数据经过排序,则二叉树查找效率还是不错的。
图: 表示物件与物件之间的关系的数学对象,常用遍历方式为深度优先遍历和广度优先遍历,这两种遍历方式对有向图和无向图都适用,但是遍历查找不及前面任一种数据结构。
MOOC的课件首先由多项式的计算为例来引入了链表这一数据结构。多项式计算的关键在于存储关键数据 1.多项式项数n 2.各项系数a 3.指数i
方法1 数组存储结构直接表示
因为存在系数为0的项,所以会造成空间的浪费。改进得到方案2,顺序存储结构只表示非零项,
方法三:链表结构存储非零项
链表结构
typedef 命令梳理
typedef : you can use it to give a type, a new name.
struct Books{ char title[];
char author[];
char subject[];
}; int main() {
struct Books Book1, Book2; //Declare Book1 , Book2 of type Books //book 1 specification
strcpy(Book1.title, "C Programming");
strcpy(Book1.author, "Nuha Ali");
strcpy(Book1.subject, ".."); typedef sturct Books{
char title[];
char author[];
char subject[];
} Book; int main() {
Book book; //只需要用Book 就可以表示 struct Books简写
strcpy(Book1.title, "C Programming");
strcpy(Book1.author, "Nuha Ali");
strcpy(Book1.subject, "..");
删除图例
// Delete first occurrence of X from a list
// Assume use of a header node void
Delete( ElementType X, List L )
{
Position P, TmpCell; //声明结构体指针 P = FindPrevious (X, L); if( !IsLast( P, L ))
{
TmpCell = P->Next; //先存好P内含的指针,再删除P
P->Next = TmpCell->Next;
free(TmpCell);
}
}
删除例程
插入:
先构造结点,P指向 n-1 的结点, 再修改带插入元素的指针
插入图例
void Insert(ElementType X, List L, Position P)
{
Position TmpCell; TmpCell= malloc( sizeof (struct Node) );
if( TmpCell == NULL)
FatalError( "Out of space!!"); TmpCell ->Element = X;
TmpCell ->Next = P->Next; //先修改插入元素的指针方向
P->Next = TmpCell;
2.堆栈结构
导入: 计算机如何进行表达式求值?
两类存储对象 1.运算数 2.运算符号
后缀表达式 与 中缀表达式
后缀 abc * + de/ - 中缀 a+b*c - d / e
后缀表达式求值策略: 记住未参与运算的数, 遇到运算符号时判断运算符号级别决定运算顺序
6 2/ 3 - 4 2 * +
6/2=3 33- =0 42× =8 0+8=8
堆栈的抽象数据类型描述
CreatStack( int MaxSize) 创建堆栈
IsFull(Stack S, int MaxSize) 判断堆栈是否满
void Push (Stack S, ElementType item) 将item压入堆栈
int IsEmpty (Stack S) 判断堆栈是否为空
ElementType Pop(Stack S) 删除并返回栈顶元素
栈模型的链表实现与数组实现
struct Node
{
ElementType Element;
PtrToNode Next;
};
链表实现基本的结构体组成
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType *Array;
};
数组实现的基本结构体组成
Push 的链表实现
Push 的数组实现
Pop的链表实现
Pop的数组实现
栈的应用实例:
中缀表达式与后缀表达式的转换
扫描中缀表达式中个各个元素,运算数直接输出,运算符号存放在栈中,根据运算优先级确定Pop 和Push的先后顺序
后缀表达式的特点 遍历各元素,遇到运算符后计算与运算符最邻近的两个元素
优先级大的压栈,可以先出,左括号运算符优先级大于 * / 但是右括号返回至左括号的所有内容
2.3 队列
队列: 具有一定操作约束的线性表 插入和删除操作:只能在一端插入,而在另一端删除
抽象数据类型:
Queue CreatQueue(int MaxSize) : 生成长度MaxSize 的空队列
int IsFullQ( Queue Q, int MaxSize): 判断队列Q是否已满
void AddQ( Queue Q, ElementType item): 将数据元素item 插入队列Q中
int IsEmptyQ( Queue Q): 判断队列Q是否为空
ElementType DeleteQ(Queue Q): 将队头数据元素从队列中删除并返回
front做删除操作 rear做插入操作 为空间的充分利用可以使用循环数组
潜在问题: 无法判定队列的状态是空 还是满
解决方案:1.使用额外标记 Size 或tag域 2.仅使用n-1个数组空间
队列的删除图例
数据结构 浙大MOOC 笔记二 线性结构的更多相关文章
- 数据结构-浙大 MOOC 笔记一 基本概念
做一些笔记记录自己的学习过程 第一节课介绍了数据结构的基本概念,首先没有直接给出相关的定义而是通过思考如何在书架上摆放书籍这样一个简单的类比了解到数据的组织方式的重要性,并通过printN函数的循环实 ...
- HighCharts学习笔记(二)HighCharts结构及详细配置
HighCharts结构及详细配置: 一.HighCharts整体结构: 通过查看API文档我们知道HighCharts结构如下:(API文档在文章后面提供下载) var chart = new Hi ...
- C语言数据结构基础学习笔记——基础线性表
线性表是指具有相同数据类型的n(n>=0)个数据元素的有限序列,它具有一个表头元素和一个表尾元素,并且每一个数据元素最多只有一个直接前驱和一个直接后继. 线性表的顺序存储也叫作顺序表,它的特性是 ...
- 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...
- java数据结构--线性结构
一.数据结构 数据结构由数据和结构两部分组成,就是将数据按照一定的结构组合起来,这样不同的组合方式有不同的效率,可根据需求选择不同的结构应用在相应在场景.数据结构大致 分为两类:线性结构(如数组,链表 ...
- Java数据结构和算法(一)线性结构
Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...
- Java数据结构介绍(线性结构和非线性结构)
数据结构包括:线性结构和非线性结构. 线性结构 数据元素之间存在一对一的线性关系 包括顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的 链式存储的线性表称为链表,链表 ...
- C#算法与数据结构之线性结构
线性结构是什么? 线性结构是一种数据结构,它有一对一的关系,就像一个长对,一个接一个,特点是,除第一个元素和最后一个元素外,其它元素前后只有一个元素. 简单示例1: static void Main( ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
随机推荐
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
- 在 kernel 下打 log。 怪異現象與解決方式。
code battery_log(BAT_LOG_CRTI, "y t: %d \n", (int)my_timer_timeout); battery_log(BAT_LOG_C ...
- 篇三:访问JSON静态文件
背景:在定位的时候带出车牌号的前两位,这里就有一个地址和车牌号前两位的映射关系,这个映射关系起初是通过Ajax在页面加载的时候请求去数据库里面查出来赋给一个变量,然后去操作,但是这个过程通常需要4~7 ...
- Keepalived的全局配置
Keepalived的全局配置 默认配置文件如下: ! Configuration File for keepalived global_defs { notification_email { aca ...
- javascript-- test() 匹配正则 与 逻辑运算符 “!”
在使用正则表达式验证"时分秒"的时候遇到了一个问题,因为业务需求,需要提供两个input 给用户输入开始时间和结束时间. js 代码: var regtime=/^([0-1]?[ ...
- 页面局部跳转(iframe)
<script type="text/javascript"> function show() { document.getElementById("ff&q ...
- 奇异值分解 SVD
一基本知识 A是一个m*n的矩阵,那么A的SVD分解为\(A_{mn} = U_{mm}\Sigma _{mn}V^T_{nn}\),其中\(U^TU = I\),\(V^TV = I\),UV的列向 ...
- OBS-Studio二次开发记录
OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...
- Django models Form model_form 关系及区别
Django models Form model_form
- CodeForces 261B Maxim and Restaurant 解法汇总
题意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a3-+ai,问满足Si<=p的i的最大值的期望.(p<=50) 这道题在网上有一些不同 ...