强烈推荐,零基础学数据结构 第4章 栈
- 格式:ppt
- 大小:548.50 KB
- 文档页数:53
第 4 章广义线性表——多维数组和广义表2005-07-14第 4 章广义线性表——多维数组和广义表课后习题讲解1. 填空⑴数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。
【解答】存取,修改,顺序存储【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。
除了初始化和销毁之外,在数组中通常只有存取和修改两种操作。
⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。
【解答】1140【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。
⑶设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。
【解答】d+41【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。
⑷稀疏矩阵一般压缩存储方法有两种,分别是()和()。
【解答】三元组顺序表,十字链表⑸广义表((a), (((b),c)),(d))的长度是(),深度是(),表头是(),表尾是()。
【解答】3,4,(a),((((b),c)),(d))⑹已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是()。
【解答】Head(Head(Tail(LS)))2. 选择题⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
数据结构--栈和队列基础知识⼀概述栈和队列,严格意义上来说,也属于线性表,因为它们也都⽤于存储逻辑关系为 "⼀对⼀" 的数据,但由于它们⽐较特殊,因此将其单独作为⼀篇⽂章,做重点讲解。
既然栈和队列都属于线性表,根据线性表分为顺序表和链表的特点,栈也可分为顺序栈和链表,队列也分为顺序队列和链队列,这些内容都会在本章做详细讲解。
使⽤栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈;使⽤队列存储数据,讲究 "先进先出",即最先进队列的数据,也最先出队列。
⼆栈2.1 栈的基本概念同顺序表和链表⼀样,栈也是⽤来存储逻辑关系为 "⼀对⼀" 数据的线性存储结构,如下图所⽰。
从上图我们看到,栈存储结构与之前所了解的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求:1. 栈只能从表的⼀端存取数据,另⼀端是封闭的;2. 在栈中,⽆论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。
拿图 1 的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。
因此,当需要从栈中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。
因此,我们可以给栈下⼀个定义,即栈是⼀种只能从表的⼀端存取数据且遵循 "先进后出" 原则的线性存储结构。
通常,栈的开⼝端被称为栈顶;相应地,封⼝端被称为栈底。
因此,栈顶元素指的就是距离栈顶最近的元素,拿下图中的栈顶元素为元素 4;同理,栈底元素指的是位于栈最底部的元素,下中的栈底元素为元素 1。
2.2 进栈和出栈基于栈结构的特点,在实际应⽤中,通常只会对栈执⾏以下两种操作:向栈中添加元素,此过程被称为"进栈"(⼊栈或压栈);从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);2.3 栈的具体实现栈是⼀种 "特殊" 的线性存储结构,因此栈的具体实现有以下两种⽅式:1. 顺序栈:采⽤顺序存储结构可以模拟栈存储数据的特点,从⽽实现栈存储结构。
栈习题⼀选择题1. 对于栈操作数据的原则是(b )。
A. 先进先出B. 后进先出C. 后进后出D. 不分顺序2. 在作进栈运算时,应先判别栈是否( ①b),在作退栈运算时应先判别栈是否( ②a )。
当栈中元素为n个,作进栈运算时发⽣上溢,则说明该栈的最⼤容量为( c③)。
为了增加内存空间的利⽤率和减少溢出的可能性,由两个栈共享⼀⽚连续的内存空间时,应将两栈的( ④d)分别设在这⽚内存空间的两端,这样,当( c⑤)时,才产⽣上溢。
①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/2④: A. 长度 B. 深度 C. 栈顶 D. 栈底⑤: A. 两个栈的栈顶同时到达栈空间的中⼼点.B. 其中⼀个栈的栈顶到达栈空间的中⼼点.C. 两个栈的栈顶在栈空间的某⼀位置相遇.D. 两个栈均不空,且⼀个栈的栈顶到达另⼀个栈的栈底.3. ⼀个栈的输⼊序列为123…n,若输出序列的第⼀个元素是n,输出第i(1<=i<=n)个元素是(b)。
A. 不确定B. n-i+1C. iD. n-i4. 若⼀个栈的输⼊序列为1,2,3,…,n,输出序列的第⼀个元素是i,则第j个输出元素是( d )。
A. i-j-1B. i-jC. j-i+1D. 不确定的5. 设栈的输⼊序列是1,2,3,4,则(d)不可能是其出栈序列。
A. 1,2,4,3,B. 2,1,3,4,C. 1,4,3,2,D. 4,3,1,2,E. 3,2,1,4,6. ⼀个栈的输⼊序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是(b )。
A. 2 3 4 1 5C. 2 3 1 4 5D. 1 5 4 3 27. 设⼀个栈的输⼊序列是1,2,3,4,5,则下列序列中,是栈的合法输出序列的是( d )。
A. 5 1 2 3 4B. 4 5 1 3 2C. 4 3 1 2 5D. 3 2 1 5 48. 某堆栈的输⼊序列为a, b,c ,d,下⾯的四个序列中,不可能是它的输出序列的是(d )。
栈的基本操作栈是一种重要的数据结构,它在计算机科学中有着广泛的应用。
对于栈的基本操作,包括入栈(push)、出栈(pop)、获取栈顶元素,以及查看栈的大小(size)等操作。
1.入栈(push)入栈的操作就是往栈里压栈,把元素压入栈顶,以实现入栈操作。
在把元素压入栈时,栈的元素数量会增加1,压入元素的位置就是栈顶。
2.出栈(pop)出栈的操作是从栈顶弹出元素,以实现出栈操作。
当一个元素从栈顶弹出时,栈的大小就会减少1,弹出元素的位置就是栈顶。
3.获取栈顶元素要获取栈顶元素,我们需要从栈中取出元素,但是这并不会改变栈的大小。
由于栈的特性,我们可以通过取出栈顶的元素来获取它,而不需要从栈的其他位置获取。
4.查看栈的大小(size)查看栈的大小也就是查看栈中有多少元素。
要查看栈的大小,我们只要通过查看栈的长度即可,从而知道栈中有多少元素,从而了解栈的大小。
到此,我们对栈的基本操作基本有了一个概念,包括入栈(push)、出栈(pop)、获取栈顶元素以及查看栈的大小(size)。
栈的操作可以用入栈出栈的方式来表示,也可以用推入和弹出的方式来表示,它们都是栈的基本操作。
栈的操作跟其他的数据结构的操作有所不同,比如要存储数据的时候,需要先进行入栈操作,而当要取出数据的时候,需要先进行出栈操作,而不是像队列里面先进行出队操作,再进行入队操作。
栈也可以用来实现字符串操作、算数表达式求值、函数调用以及实现括号的匹配等等,这些都是栈的基本操作的应用。
总而言之,栈是一种重要的数据结构,其基本操作可以说是它的核心。
因此,学习栈的基本操作非常重要,只有掌握了它的基本操作,才可以正确的使用栈这种数据结构。
第4章 数据结构与算法本章介绍数据结构与算法,内容包括算法和数据结构的基本概念、栈及线性链表、树与二叉树、排序技术、查找技术。
●了解数据结构与算法的基本概念。
●了解栈与线性链表的操作。
●了解树与二叉树。
●了解数据结构中的排序技术和查找技术。
4.1 算法的概念4.1.1 算法的基本概念程序是算法用某种程序设计语言的具体实现。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂度和时间复杂度来衡量。
算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。
一个状态到另一个状态的转移不一定是确定的。
随机化算法在内的一些算法包含了一些随机输入。
算法具有的一些重要特性:(1)有限性。
算法在执行有限步之后必须终止。
(2)确定性。
算法的每一个步骤都是有精确的定义的。
执行的每一步都是清晰的、无二义的。
大学计算机基础84(3)输入。
一个算法具有任意个输入,它是由外部提供的,作为算法执行前的初始状态。
(4)输出。
算法一定有输出结果。
(5)可行性。
算法中的运算都必须是可以实现的。
4.1.2 算法的复杂度1.时间复杂度算法的时间复杂度采用算法执行过程中其基本操作的执行次数,即计算量来度量。
算法中基本操作的执行次数一般是与问题的规模有关的,对于节点个数为n的数据处理问题,用T(n)表示算法基本操作的执行次数。
当比较不同算法的时间性能时,主要标准是看不同算法时间复杂度所处的数量级如何。
例如:以上算法中,循环体中的代码执行了n次,因此算法的时间复杂度为O(n)。
第1篇第一部分:基本概念与操作1. 什么是栈?- 栈是一种线性数据结构,遵循后进先出(LIFO)的原则。
它只允许在栈顶进行插入(push)和删除(pop)操作。
2. 栈的基本操作有哪些?- 入栈(push):在栈顶添加一个新元素。
- 出栈(pop):移除栈顶元素。
- 查看栈顶元素(peek 或 top):获取栈顶元素但不移除它。
- 判断栈是否为空(isEmpty):检查栈中是否没有元素。
- 获取栈的大小(size):返回栈中元素的数量。
3. 请用Python实现一个栈的数据结构。
```pythonclass Stack:def __init__(self):self.items = []def is_empty(self):return len(self.items) == 0def push(self, item):self.items.append(item)def pop(self):if not self.is_empty():return self.items.pop()return Nonedef peek(self):if not self.is_empty():return self.items[-1]return Nonedef size(self):return len(self.items)```4. 如何实现一个固定大小的栈?- 在栈类中添加一个计数器来跟踪栈的大小,并在push操作中检查是否已达到最大容量。
5. 请解释栈的两种遍历方法。
- 递归遍历:使用递归方法遍历栈的所有元素。
- 迭代遍历:使用栈的辅助结构(如队列)来实现迭代遍历。
第二部分:栈的应用6. 栈在计算机科学中的应用有哪些?- 函数调用:局部变量和返回地址存储在栈中。
- 表达式求值:逆波兰表达式(RPN)计算。
- 字符串匹配:括号匹配验证。
- 汉诺塔问题:移动塔的步骤可以通过栈来模拟。
7. 请解释如何使用栈实现括号匹配验证。
1、栈的“先进后出”特性是指()。
A.最后进栈的元素总是最先出栈B.同时进行进栈和出栈操作时,总是进栈优先C.每当有出栈操作时,总要先进行一次进栈操作D.每次出栈的元素总是最先进栈的元素正确答案:A2、给定一个足够大的空栈,有 4 个元素的进栈次序为 A、B、C、D,则以C、D开头的出栈序列的个数为()。
A.1B.2C.3D.4正确答案:A解析:若出栈序列为CD…,则A、B、C进栈,C出栈,D进栈,D出栈,此后只有B出栈和A出栈一种情况,所以这样的出栈序列只有 CDBA 一个。
3、若元素a、b、c、d、e、f依次进栈,允许进栈、退栈的操作交替进行,但不允许连续3次退栈工作,则不可能得到的出栈序列是()。
A.dcebfaB.cbdaefC.bcaefdD.afedcb正确答案:D 解析:选项A操作:a进,b进,c进,d进,d出,c出,e进,e 出,b出,f进,f出,a出。
选项B操作:a进,b进,c进,c出,b出,d进,d出,a出,e 进,e出,f进,f出。
选项C操作:a进,b进,b出,c进,c出,a出,d进,e进,e 出,f进,f出,d出。
选项D操作:a进,a出,b进,c进,d进,e进,f进,f出,e 出,d出,c出,b出。
从中看到,选项D中最后连续出栈5次,不符合要求。
4、一个栈的进栈序列是a、b、c、d、e,则栈的不可能的输出序列是()。
A.edcbaB.decbaC.dceabD.abcde正确答案:C解析:对于选项A,a、b、c、d、e进栈,e、d、c、b、a出栈;对于选项B,a,b,c,d进栈,d出栈,e进栈,e出栈,c、b、a 依次出栈;对于选项C,a、b、c、d进栈,d出栈,c出栈,e进栈,e出栈,此时栈中从栈底到栈顶为a、b,不可能a先出栈,所以C是不可能的输出序列;对于选项D,a进栈,a出栈,b进栈,b出栈,c进栈,c出栈,d 进栈,d出栈,e进栈,e出栈。
5、当用一个数组data[0..n-1]存放栈中元素时,栈底最好()。
期末复习 第一章 绪论 复习1、计算机算法必须具备输入、输出、可行性、确定性、有穷性5个特性。
2、算法分析的两个主要方面是空间复杂度和时间复杂度。
3、数据元素是数据的基本单位。
4、数据项是数据的最小单位。
5、数据结构是带结构的数据元素的集合。
6、数据的存储结构包括顺序、链接、散列和索引四种基本类型。
数据结构算 法数据:计算机处理的信息总称数据项:最小单位 数据元素:最基本单位数据对象:元素集合数据结构:相互之间存在一种或多种特定关系的数据元素集合。
概念:数据元素之间的关系 线性结构:一对一非线性结构 树:一对多 图:多对多顺序存储结构 链表存储结构 索引。
散列。
算法描述:指令的有限有序序列有穷性 确定性 可行性 输入 输出 时间复杂度 空间复杂度第二章 线性表 复习1、在双链表中,每个结点有两个指针域,包括一个指向前驱结点的指针 、一个指向后继结点的指针2、线性表采用顺序存储,必须占用一片连续的存储单元3、线性表采用链式存储,便于进行插入和删除操作4、线性表采用顺序存储和链式存储优缺点比较。
5、简单算法第三章 栈和队列 复习定义逻辑关系:前趋 后继节省空间 随机存取 插、删效率低 插入 删除1、 栈和队列的异同点。
2、 栈和队列的基本运算3、 出栈和出队4、 基本运算第四章 串 复习存储结构栈的概念:在一端操作的线性表 运算算法栈的特点:先进后出 LIFO初始化 进栈push 出栈pop顺序队列 循环队列队列概念:在两端操作的线性表 假溢出链队列队列特点:先进先出 FIFO基本运算顺序:链队:队空:front=rear队满:front=(rear+1)%MAXSIZE队空:rear 初始化 判空 进队 出队取队首元素第五章 数组和广义表 复习定义:由n(≥1)个字符组成的有限序列 S=”c 1c 2c 3 ……cn ”串长度、空白串、空串。
紧缩格式 非紧缩格式以字节为单位的存储格式 (C 语言用数组或指针表示) 基本运算strlen(s) 串长度 strcat(s1,s2) 联接 strcmp(s1,s2) 比较 strcpy(s1,s2) 复制 strstr(s1,s2) 子串查询模式匹配失败链接值匹配算法单字符链表串 多字符链表串串变量的存储映像:串名、串值对应关系表顺序存储方式压缩存储方式行优先顺序存放列优先顺序存放C语言数组:行优先下标从[0]开始,公式变化稀疏矩阵应用表达式程序调用广义表定义:n(≥0)个元素的有限序列表头:Head(A)= a1概念:长度、深度、原子、子表表尾:Tail(A)=(a2,a3,…,a n)表结点特殊矩阵对称矩阵三角矩阵对角矩阵三元组存储:三元组m n t链表存储:十字链表原子结点第六章 树 复习1、三个结点可以组成2种不同形态的树。
名词解释栈栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。
栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是只能在某一端插入和删除的特殊线性表。
用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。
取走时,只能从上面一件一件取。
堆和取都在顶部进行,底部一般是不动的。
栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。
插入一般称为进栈(PUSH),删除则称为退栈(POP)。
栈也称为后进先出表(LIFO表)。
在程序中,堆用于动态分配和释放程序所使用的对象。
在以下情况中调用堆操作:1.事先不知道程序所需对象的数量和大小。
2.对象太大,不适合使用堆栈分配器。
堆使用运行期间分配给代码和堆栈以外的部分内存。
传统上,操作系统和运行时库随附了堆实现。
当进程开始时,操作系统创建称为进程堆的默认堆。
如果没有使用其他堆,则使用进程堆分配块。
语言运行时库也可在一个进程内创建单独的堆。
(例如,C运行时库创建自己的堆。
)除这些专用堆外,应用程序或许多加载的动态链接库(DLL)之一也可以创建并使用单独的堆。
Win32提供了一组丰富的API用于创建和使用专用堆。
有关堆函数的优秀教程,请参阅MSDN平台SDK节点。
当应用程序或DLL创建专用堆时,这些堆驻留于进程空间中并且在进程范围内是可访问的。
某一给定堆分配的任何数据应为同一堆所释放。
(从一个堆分配并释放给另一个堆没有意义。
)在所有虚拟内存系统中,堆位于操作系统的虚拟内存管理器之上。
语言运行时堆也驻留在虚拟内存之上。
某些情况下,这些堆在操作系统堆的上层,但语言运行时堆通过分配大的块来执行自己的内存管理。
绕开操作系统堆来使用虚拟内存函数可使堆更好地分配和使用块。
典型的堆实现由前端分配器和后端分配器组成。
前端分配器维护固定大小块的自由列表。
数据结构-栈⼀、栈1. 1. 为什么要学习栈?栈是什么?为什么要学习它?现在先来说说栈的辉煌作⽤吧!在计算机领域中,栈是⼀种不可忽略的概念,⽆论从它的结构上,还是存储数据⽅⾯,它对于学习数据结构的⼈们来说,都是⾮常重要的。
那么就会有⼈问,栈究竟有什么作⽤,让我们这么重视它?⾸先,栈具有⾮常强⼤的“记忆”功能,它可以保存对你有作⽤的数据,也可以被叫做保存现场;其次,当咱们调⽤⼀个带参函数时候,被调⽤的函数的形参,在编译器编译的时候,这些形参都需要⼀定的空间存放他们,这时计算机就会默认帮你保存到栈中了!1. 2. 栈的定义栈的作⽤,这是⼀个咱们⽣活中处处⽤到,但是却⼜没发现的⼀种现象,例如当你拿个篮⼦去买苹果,那么你最先挑选的苹果就是在篮⼦的最底下,最后挑选的苹果就在篮⼦的最上边,那么这就造成了这么⼀种现象:先拿进篮⼦的苹果,要最后才能取出来;相反,最后拿进篮⼦的苹果,就能最先取出来!栈是限定只能在表尾进⾏插⼊和删除的线性表。
我们把允许插⼊和删除的⼀端称作栈顶(Top),另⼀端称作栈底(bottom)。
不含任何数据元素的栈被称作空栈,栈也被称为先进后出的线性表(具有线性关系)。
⽽栈的特殊性,就是在表中想进⾏插⼊和删除的操作,只能在栈顶进⾏。
这也就使得了:栈底是⾮常稳定的,因为先进来的元素都被放在了栈底。
栈的插⼊操作:叫做进栈,也叫作压栈,⼊栈。
栈的删除操作:叫做出栈,也叫弹栈。
1. 3. 进栈出栈变化形式现在请⼤家思考这样的⼀个问题:最先进栈的元素,是不是只能最后才能出来呢?答案是不⼀定的,这个问题就要细分情况了。
栈对线性表的插⼊和删除的位置进⾏了限制,并没有对元素的进出时间进⾏限制,这也就是说,在不是所有元素都进栈的情况下,事先进去的元素也可以先出站,只要确保⼀点:栈元素是从栈顶出栈就可以了!举例来说,现在有3个整型数元素1、2、3依次进栈,会有哪些出栈次序呢?第⼀种:1、2、3依次进,再3、2、1依次出栈。