线性表及其表现

第二章的内容是关于三种最基本的数据结构 结合《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, "..");
“为了避免插入和删除的线性开销,我们需要允许表可以不连续存储,否则表的部分或全部需要整体移动。”
用数组来计算的话,优势在于
 
基本操作: MakeEmpty()  FindKth(int K, List L) Find(ElementType X, List L)
      Insert(ElementType X, int i, List L)  Delete(int i, List L)  Length(List L) 
 

删除图例

 // 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 笔记二 线性结构的更多相关文章

  1. 数据结构-浙大 MOOC 笔记一 基本概念

    做一些笔记记录自己的学习过程 第一节课介绍了数据结构的基本概念,首先没有直接给出相关的定义而是通过思考如何在书架上摆放书籍这样一个简单的类比了解到数据的组织方式的重要性,并通过printN函数的循环实 ...

  2. HighCharts学习笔记(二)HighCharts结构及详细配置

    HighCharts结构及详细配置: 一.HighCharts整体结构: 通过查看API文档我们知道HighCharts结构如下:(API文档在文章后面提供下载) var chart = new Hi ...

  3. C语言数据结构基础学习笔记——基础线性表

    线性表是指具有相同数据类型的n(n>=0)个数据元素的有限序列,它具有一个表头元素和一个表尾元素,并且每一个数据元素最多只有一个直接前驱和一个直接后继. 线性表的顺序存储也叫作顺序表,它的特性是 ...

  4. 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告

    课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...

  5. java数据结构--线性结构

    一.数据结构 数据结构由数据和结构两部分组成,就是将数据按照一定的结构组合起来,这样不同的组合方式有不同的效率,可根据需求选择不同的结构应用在相应在场景.数据结构大致 分为两类:线性结构(如数组,链表 ...

  6. Java数据结构和算法(一)线性结构

    Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...

  7. Java数据结构介绍(线性结构和非线性结构)

    数据结构包括:线性结构和非线性结构. 线性结构 数据元素之间存在一对一的线性关系 包括顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的 链式存储的线性表称为链表,链表 ...

  8. C#算法与数据结构之线性结构

    线性结构是什么? 线性结构是一种数据结构,它有一对一的关系,就像一个长对,一个接一个,特点是,除第一个元素和最后一个元素外,其它元素前后只有一个元素. 简单示例1: static void Main( ...

  9. muduo学习笔记(二)Reactor关键结构

    目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...

随机推荐

  1. 迁移 SQL Server 数据库到 Azure SQL 实战

    最近有个维护的项目需要把 SQL Server 2012 的数据库迁移到 Azure SQL 上去,迁移过程可谓一波三折,故在此分享这次迁移中碰到的点点滴滴,希望对朋友们有所帮助. 文章来源:葡萄城产 ...

  2. Ubuntu上基于开源代码PhoneMe的J2ME环境搭建及使用

    测试环境:Ubuntu 14.04.5 LTS J2ME背景知识及PhoneME介绍 J2ME相关介绍 在正式开始介绍J2ME之前,这里我列出一些常见名词,方便与下文参照:J2ME(Java2 Pla ...

  3. Android开发 Error:The number of method references in a .dex file cannot exceed 64K.

    在Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件.因为Android系统使用Dalvik虚拟机,所以需要把使用Java ...

  4. HV000030: No validator could be found for type: java.lang.Integer.

    在写接口时,一般去查找在类的Integer属性上加了不属于整型的校验,比如@NotEmpty,@Length等 @JSONField(name = "deviceNum") @No ...

  5. C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP

    本代码的编译环境为MAC,系统版本为10.11.6: #include <string.h> #include <netdb.h> #include <stdio.h&g ...

  6. PRINCE2特征(三)

    提到不确定性,可能很多从事项目管理相关工作的人都会感同身受,一系列临时性问题,比如:变更.延期.调整.计划赶不上变化.团队调整等的出现,都是项目中再正常不过的内容.但正常不等于合理,我们还是要去思考一 ...

  7. sql分页操作

    看到了网上关于分页的讲解  对最快的分页语句做了测试 还别说速度真快 总共6w条数据 速度确实so 快 前提是id是主键 或者是索引 declare @page int;--页数 declare @P ...

  8. 配置react native遇到的问题

    折腾了两天终于解决了问题,一开始用模拟器是报如下图的错 然后用真机的时候又报下图的错 这个错误网上有很多解决方法,说是要降级处理,将build.gradle中的1.3.1改成1.2.3,但是改完之后问 ...

  9. cocos2dx-lua_修改源码流程(cocos2dx-3.10、win7、Cocos Code IDE1.2)

    以下是在cocos2dx-3.10.win7.Cocos Code IDE1.2下假定你已经配置好了cocos2dx的环境.1.修改源代码步骤(1)在Cocos/Cocos2d-x/cocos2d-x ...

  10. sass接触

    第一句话就是棒棒的,我爱上了. 看了真阿当的文章:<2016年前端技术观察> http://weibo.com/ttarticle/p/show?id=230940405256054051 ...