数据结构 第三章学习小结
- 数据结构第三章学习小结
- 3.1-3.3
- 3.1 栈和队列的定义和特点
- 栈的定义和特点
- 仅在表尾进行插入或删除操作的线性表。(后进先出)
- 队列的定义和特点
- 在表头进行插入操作,在表尾进行删除操作的线性表。(先进先出)
- 栈的定义和特点
- 3.2 案例引入
- 数制的转换
- 括号匹配的检验
- 表达式求值
- 舞伴问题
- 3.3 栈的表示和操作的实现
- 栈的类型定义
栈的抽象数据类型定义 ADT Stack{ 数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=1,2, …,n } 约定an端为栈顶,a1端为栈底。 基本操作: InitStack( &S ) 操作结果:构造一个空栈S。 DestroyStack ( &S ) 初始条件:栈S已存在。 操作结果:销毁栈S。 ClearStack( &S ) 初始条件:栈S已存在。 操作结果:将S清为空栈。 StackEmpty( S ) 初始条件:栈S已存在。 操作结果:若S为空栈,则返回TRUE,否则返回FALSE。 StackLength( S ) 初始条件:栈S已存在。 操作结果:返回S的数据元素个数,即栈的长度。 GetTop( S, &e ) 初始条件:栈S已存在且非空。 操作结果:用e返回S的栈顶元素。 Push( &S, e ) 初始条件:栈S已存在。 操作结果:插入元素e为新的栈顶元素。 Pop( &S, &e ) 初始条件:栈S已存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。 StackTraverse( S, visit() ) 初始条件:栈S已存在且非空。 操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。 }ADT Stack
- 顺序栈的表示与实现
- 基本操作实现算法:初始化/入栈/出栈/取栈顶元素
- 链栈的表示与实现
- 基本操作实现算法:初始化/入栈/出栈/取栈顶元素
- 栈的类型定义
- 3.1 栈和队列的定义和特点
- 3.4 栈与递归
- 递归求解:能够分解成几个相对简单且解法相同或类似的子问题来求解
- 采用递归算法解决的问题
- 1.定义是递归的 (实例:阶乘函数 )
- 2.数据结构是递归的 (实例:链表)
- 3. 问题的解法是递归的 (实例:Hanoi塔问题、八皇后问题、迷宫问题)
- “分治法”——分解-求解的策略
- 三个条件
- (1) 能将一个问题转变成一个新问题, 而新问题与原问题的解法相同或类同, 不同的仅是处理的对象, 并且这些处理对象更小且变化有规律
- (2) 可以通过上述转化而使问题简化
- (3) 必须有一个明确的递归出口,或称递归的边界
- 三个条件
- 3.5 队列的表示和操作的实现
- 队列有两种存储表示:顺序表示和链式表示
- 循环队列——队列的顺序表示和实现
- 队空的条件: Q.front = Q.rear
- 队满的条件: (Q rear+ 1)%MAXSIZE = Q.front
- 基本操作实现算法:初始化/求队列长度/入队/出队/取队头元素
- 链队——队列的链式表示和实现
- 队列的类型定义
队列的抽象数据类型定义: ADT Queue ( 数据对象:D={ai|ai∈ElemSet ,i=1,2,…, n ,n�O} 数据关系:R={ <ai-1,ai> |ai-1,ai∈D , i=2, …, n} 约定其中a1端为队列头,an端为队列尾。 基本操作: InitQueue (&Q) 操作结果:构造一个空队列Q。 Des t royQueue (&Q) 初始条件:队列Q已存在。 操作结果:队列Q被销毁, 不再存在。 ClearQueue (&Q) 初始条件:队列Q巳存在。 操作结果:将Q清为空队列。 QueueEmpty (Q) 初始条件:队列Q已存在。 操作结果:若Q为空队列,则返回true, 否则返回false。 QueueLength(Q) 初始条件:队列Q已存在。 操作结果:返回Q的元素个数,即队列的长度。 GetHead(Q} 初始条件:Q为非空队列。 操作结果:返回Q的队头元素。 EnQueue (&Q, e} 初始条件:队列Q已存在。 操作结果:插入元素e为Q的新的队尾元素。 DeQueue(&Q, &e) 初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e 返回其值。 QueueTr aver se(Q) 初始条件:Q已存在且非空。 操作结果:从队头到队尾,依次对Q的每个数据元素访问。 ) ADT Queue
- 基本操作实现算法:初始化/入队/出队/取队头元素
- 队列的类型定义
- 循环队列——队列的顺序表示和实现
- 队列有两种存储表示:顺序表示和链式表示
- 3.6-3.7
- 3.6 案例分析与实现
- 3.7 小结
- 3.1-3.3
- 心得体会
- 栈和队列的特点之前都了解过一点,所以比较熟悉,比较好掌握。主要难点个人觉得在于递归,说难不难,说简单不简单,还是得好好理解题意才能运用好。在pta上的作业代码使用了STL以及自定义栈两种方法,发现STL不用自定义,方便容易很多,但是STL也要注意它的使用方式,但是要多查多看多记多用。第三次分组协作代码个人感觉想思路的时候比之前脑子更好使了,哈哈,感觉写代码不太费力了。只要思路对了,一步步实现很简单。但是对于优化代码,或者说代码实现方式选择还是比较困难,所以以后还是得多注意多学习一下。第四章要开始学习kmp算法,感觉会比较难一点,但是依旧脚踏实地一步一步学,我相信可以掌握很好。
- 补充递归:
- 自底向上的求解方法:由最小规模问题逐步向上求解,直至求出原问题的解。
- 自顶向下的求解方法:从原问题出发,分解出规模减小了的子问题,直至终止条件,然后由终止条件的结果进行回推,求出原问题的值。
- 专业术语:迭代——循环结构
- 补充栈和队列的比较:
-
栈(Stack)和队列(Queue)是两种操作受限的线性表。
(线性表:线性表是一种线性结构,它是一个含有n≥0个结点的有限序列,
同一个线性表中的数据元素数据类型相同并且满足“一对一”的逻辑关系。“一对一”的逻辑关系指的是对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,
有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。)这种受限表现在:栈的插入和删除操作只允许在表的尾端进行(在栈中成为“栈顶”),满足“FIFO:First In Last Out”;
队列只允许在表尾插入数据元素,在表头删除数据元素,满足“First In First Out”。栈与队列的相同点:
1.都是线性结构。
2.插入操作都是限定在表尾进行。
3.都可以通过顺序结构和链式结构实现。、
4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。
5.多链栈和多链队列的管理模式可以相同。
栈与队列的不同点:
1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;
常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。3.顺序栈能够实现多栈空间共享,而顺序队列不能。
-
- 补充递归的注意点:
1.递归编程简单,只需要关注本层逻辑。
2.递归可用备忘录,利用数组将数据存储下来并可读取,否则可能出现重复子问题的情况
- 本章节分享:
深究递归和迭代的区别、联系、优缺点及实例对比
https://www.cnblogs.com/zhizhan/p/4892886.html