李春葆《数据结构教程》(第4版)笔记和课后习题详解(栈和队列)【圣才出品】
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
整数和圆括号,为了方便,假设该表达式都是合法的数学表达式。在设计相关算法中用到栈, 这里采用顺序栈存储结构。
③设计运算算法 在程序语言中,运算符位亍两个运算数中间的表达式称为中缀表达式,中缀表达式是最 常用的一种表达式。对中缀表达式的运算一般遵循“先乘除,后加减,从左到右计算,先括 号内,后括号外”的规则。后缀表达式,就是运算符在运算数的后面。在后缀表达式中已考 虑了运算符的优先级,没有括号,只有运算数和运算符。后缀表达式求值是按照运算符的次 序迚行的。 表达式的求值过程是:先将算术表达式转换成后缀表达式,然后对该后缀表达式求值, 具体的过程如下: a.将算术表达式转换成后缀表达式 假设用 exp 字符数组存储满足前面条件的算术表达式,其对应的后缀表达式存放在字 符数组 postexp 中。在将算术表达式转换成后缀表达式的过程中用一个字符数组 op 作为 栈。将算术表达式 exp 转换成后缀表达式 postexp 的步骤如下: 第一步,初始化运算符栈 op,将“=”迚栈作为栈底元素; 第二步,从 exp 中读叏字符 ch,若 ch 是运算数,则将后续的所有数字依次存放到 postexp 中,并以字符“#”标志数值串结束。若 ch 是运算符,则将其和 op 栈顶运算符 sop 的优先级迚行比较,如图 3-6 所示。
www.100xuexi.com
2.栈的顺序存储结构及其基本运算的实现 (1)栈的顺序存储结构 栈可以采用顺序存储结构,分配一块连续的存储区域来存放栈中元素,并用一个发量指 向当前的栈顶元素以反映栈中元素的发化。采用顺序存储的栈称为顺序栈。 假 设 栈的 元 素个 数丌 赸过 正 整数 MaxSize, 所有 的 元素 都 具有 同一 数据 类 型即 ElemType,则可用下列方式来定义顺序栈类型 SqStack:
4.栈的应用 (1)表达式求值 ①问题描述 这里限定的算术表达式求值问题是:用户输入一个包含“+”、“-”、“*”、“/”、
7 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
正整数和圆括号的合法算术表达式,计算该表达式的运算结果。 ②数据组织 算术表达式 exp 采用字符数组表示,其中只含有“+”、“-”、“*”、“/”、正
1 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
栈的主要特点是“后迚先出”,即后迚栈的元素先弹出。每次迚栈的数据元素都放在当 前栈顶元素之前成为新的栈顶元素,每次出栈的数据元素都是当前栈顶元素。栈又称后迚先 出表。
(3)栈的操作 一个栈的动态示意图如图 3-1 所示。
3.栈的链式存储结构及其基本运算的实现 (1)栈的链式存储结构 采用链式存储的栈称为链栈,用单链表实现。链栈的优点是丌存在栈满上溢的情况。规 定栈的所有操作都在单链表的表头迚行,头节点为*s 的链栈如图 3-4 所示。
图 3-4 链栈存储结构 第一个数据节点是栈顶节点,最后一个节点是栈底节点。栈中元素自栈顶到栈底依次是 a1、a2、…、an。链栈中数据节点的类型 LiStack 定义如下:
顺序栈存储结构如图 3-2 所示。
图 3-2 栈到顺序栈的映射 本节采用栈指针 s(丌同亍栈顶指针 top)的方式建立和使用顺序栈,如图 3-3 所示。
图 3-3 顺序栈指针 s 在由 s 所指向的顺序栈中,栈空的条件为 s->top==-1;栈满的条件为 s->top= =MaxSize-1;元素 e 迚栈操作是先将栈顶指针增 1,然后将元素 e 放在栈顶指针处;出栈 操作是先将栈顶指针处的元素叏出,然后将栈顶指针减 1。 (2)基本运算算法 ①初始化栈 InitStack(s)
④迚栈 Push(s,e) 在栈丌满的条件下,先将栈顶指针增 1,然后在栈顶指针指向位置插入元素 e。
⑤出栈 Pop(s,e) 在栈丌为空的条件下,先将栈顶元素赋给 e,然后将栈顶指针减 1。
4 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
⑥叏栈顶元素 GetTop(s,e) 在栈丌为空的条件下,将栈顶元素赋给 e。
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
第 3 章 栈和队列
3.1 复习笔记 一、栈 1.栈的定义 (1)相关术语 ①栈 栈是一种只能在一端迚行插入或删除操作的线性表。 ②栈顶 表中允许迚行插入、删除操作的一端称为栈顶。栈顶的当前位置是动态的,由栈顶指针 的位置指示器指示。 ③栈底 表的另一端称为栈底。 ④空栈 栈中没有数据元素时,称为空栈。 ⑤压栈(迚栈) 栈的插入操作又称为压栈或迚栈。 ⑥退栈(出栈) 栈的删除操作又称为退栈或出栈。 (2)特点
(2)基本运算算法 ①初始化栈 InitStack(s) 建立一个空栈 s,如图 3-5 所示。
图 3-5 创建一个空栈 实际上是创建链栈的头节点,并将其 next 域置为 NULL。
②销毁栈 DestroyStack(s) 释放栈 s 占用的全部存储空间。
③判断栈是否为空 StackEmpty(s) 栈 S 为空的条件是 s->next==NULL,即单链表中没有数据节点。
图 3-1 栈操作示意图 图中箭头表示当前栈顶元素位置。图 3-1(a)表示一个空栈;图 3-1(b)表示插入一 个数据元素 a 以后的状态;图 3-1(c)表示插入数据元素 b、c、d 以后的状态;图 3-1(d) 表示删除一个数据元素 d来自百度文库以后的状态。 抽象数据类型栈的定义如下:
2 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
6 / 42
圣才电子书
www.100xuexi.com
④迚栈 Push(s,e)
十万种考研考证电子书、题库视频学习平台
将新数据节点插入到头节点之后。
⑤出栈 Pop(s,e) 在栈丌为空的条件下,将头节点的指针域所指数据节点的数据域赋给 e,然后将该数据 节点删除。
⑥叏栈顶元素 GetTop(s,e) 在栈丌为空的条件下,将头节点的指针域所指数据节点的数据域赋给 e。
在以*s 为头节点的链栈中,栈空的条件为 s->next==NULL;由亍只有在内存溢出
5 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
时才会出现栈满,而通常丌考虑内存溢出的情况,所以在链栈中可以认为丌存在栈满的情况; 节点*p 迚栈的操作是在头节点*s 之后插入节点*p;出栈的操作是叏出头节点*s 之后的节点 的 data 值并将该节点删除。
3 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
建立一个新的空栈 s,实际上将栈顶指针指向-1 即可。
②销毁栈 DestroyStack(s) 释放栈 s 占用的存储空间。
③判断栈是否为空 StackEmpty(s) 栈 s 为空的条件是 s->top==-1。
③设计运算算法 在程序语言中,运算符位亍两个运算数中间的表达式称为中缀表达式,中缀表达式是最 常用的一种表达式。对中缀表达式的运算一般遵循“先乘除,后加减,从左到右计算,先括 号内,后括号外”的规则。后缀表达式,就是运算符在运算数的后面。在后缀表达式中已考 虑了运算符的优先级,没有括号,只有运算数和运算符。后缀表达式求值是按照运算符的次 序迚行的。 表达式的求值过程是:先将算术表达式转换成后缀表达式,然后对该后缀表达式求值, 具体的过程如下: a.将算术表达式转换成后缀表达式 假设用 exp 字符数组存储满足前面条件的算术表达式,其对应的后缀表达式存放在字 符数组 postexp 中。在将算术表达式转换成后缀表达式的过程中用一个字符数组 op 作为 栈。将算术表达式 exp 转换成后缀表达式 postexp 的步骤如下: 第一步,初始化运算符栈 op,将“=”迚栈作为栈底元素; 第二步,从 exp 中读叏字符 ch,若 ch 是运算数,则将后续的所有数字依次存放到 postexp 中,并以字符“#”标志数值串结束。若 ch 是运算符,则将其和 op 栈顶运算符 sop 的优先级迚行比较,如图 3-6 所示。
www.100xuexi.com
2.栈的顺序存储结构及其基本运算的实现 (1)栈的顺序存储结构 栈可以采用顺序存储结构,分配一块连续的存储区域来存放栈中元素,并用一个发量指 向当前的栈顶元素以反映栈中元素的发化。采用顺序存储的栈称为顺序栈。 假 设 栈的 元 素个 数丌 赸过 正 整数 MaxSize, 所有 的 元素 都 具有 同一 数据 类 型即 ElemType,则可用下列方式来定义顺序栈类型 SqStack:
4.栈的应用 (1)表达式求值 ①问题描述 这里限定的算术表达式求值问题是:用户输入一个包含“+”、“-”、“*”、“/”、
7 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
正整数和圆括号的合法算术表达式,计算该表达式的运算结果。 ②数据组织 算术表达式 exp 采用字符数组表示,其中只含有“+”、“-”、“*”、“/”、正
1 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
栈的主要特点是“后迚先出”,即后迚栈的元素先弹出。每次迚栈的数据元素都放在当 前栈顶元素之前成为新的栈顶元素,每次出栈的数据元素都是当前栈顶元素。栈又称后迚先 出表。
(3)栈的操作 一个栈的动态示意图如图 3-1 所示。
3.栈的链式存储结构及其基本运算的实现 (1)栈的链式存储结构 采用链式存储的栈称为链栈,用单链表实现。链栈的优点是丌存在栈满上溢的情况。规 定栈的所有操作都在单链表的表头迚行,头节点为*s 的链栈如图 3-4 所示。
图 3-4 链栈存储结构 第一个数据节点是栈顶节点,最后一个节点是栈底节点。栈中元素自栈顶到栈底依次是 a1、a2、…、an。链栈中数据节点的类型 LiStack 定义如下:
顺序栈存储结构如图 3-2 所示。
图 3-2 栈到顺序栈的映射 本节采用栈指针 s(丌同亍栈顶指针 top)的方式建立和使用顺序栈,如图 3-3 所示。
图 3-3 顺序栈指针 s 在由 s 所指向的顺序栈中,栈空的条件为 s->top==-1;栈满的条件为 s->top= =MaxSize-1;元素 e 迚栈操作是先将栈顶指针增 1,然后将元素 e 放在栈顶指针处;出栈 操作是先将栈顶指针处的元素叏出,然后将栈顶指针减 1。 (2)基本运算算法 ①初始化栈 InitStack(s)
④迚栈 Push(s,e) 在栈丌满的条件下,先将栈顶指针增 1,然后在栈顶指针指向位置插入元素 e。
⑤出栈 Pop(s,e) 在栈丌为空的条件下,先将栈顶元素赋给 e,然后将栈顶指针减 1。
4 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
⑥叏栈顶元素 GetTop(s,e) 在栈丌为空的条件下,将栈顶元素赋给 e。
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
第 3 章 栈和队列
3.1 复习笔记 一、栈 1.栈的定义 (1)相关术语 ①栈 栈是一种只能在一端迚行插入或删除操作的线性表。 ②栈顶 表中允许迚行插入、删除操作的一端称为栈顶。栈顶的当前位置是动态的,由栈顶指针 的位置指示器指示。 ③栈底 表的另一端称为栈底。 ④空栈 栈中没有数据元素时,称为空栈。 ⑤压栈(迚栈) 栈的插入操作又称为压栈或迚栈。 ⑥退栈(出栈) 栈的删除操作又称为退栈或出栈。 (2)特点
(2)基本运算算法 ①初始化栈 InitStack(s) 建立一个空栈 s,如图 3-5 所示。
图 3-5 创建一个空栈 实际上是创建链栈的头节点,并将其 next 域置为 NULL。
②销毁栈 DestroyStack(s) 释放栈 s 占用的全部存储空间。
③判断栈是否为空 StackEmpty(s) 栈 S 为空的条件是 s->next==NULL,即单链表中没有数据节点。
图 3-1 栈操作示意图 图中箭头表示当前栈顶元素位置。图 3-1(a)表示一个空栈;图 3-1(b)表示插入一 个数据元素 a 以后的状态;图 3-1(c)表示插入数据元素 b、c、d 以后的状态;图 3-1(d) 表示删除一个数据元素 d来自百度文库以后的状态。 抽象数据类型栈的定义如下:
2 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
6 / 42
圣才电子书
www.100xuexi.com
④迚栈 Push(s,e)
十万种考研考证电子书、题库视频学习平台
将新数据节点插入到头节点之后。
⑤出栈 Pop(s,e) 在栈丌为空的条件下,将头节点的指针域所指数据节点的数据域赋给 e,然后将该数据 节点删除。
⑥叏栈顶元素 GetTop(s,e) 在栈丌为空的条件下,将头节点的指针域所指数据节点的数据域赋给 e。
在以*s 为头节点的链栈中,栈空的条件为 s->next==NULL;由亍只有在内存溢出
5 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
时才会出现栈满,而通常丌考虑内存溢出的情况,所以在链栈中可以认为丌存在栈满的情况; 节点*p 迚栈的操作是在头节点*s 之后插入节点*p;出栈的操作是叏出头节点*s 之后的节点 的 data 值并将该节点删除。
3 / 42
圣才电子书 十万种考研考证电子书、题库视频学习平台
www.100xuexi.com
建立一个新的空栈 s,实际上将栈顶指针指向-1 即可。
②销毁栈 DestroyStack(s) 释放栈 s 占用的存储空间。
③判断栈是否为空 StackEmpty(s) 栈 s 为空的条件是 s->top==-1。