【2012四川大学,数据结构与算法设计】第3讲 堆栈、队列和字符串
- 格式:ppt
- 大小:1.10 MB
- 文档页数:184
数据结构第三章数据结构堆栈和队列在计算机科学中,数据结构是组织和存储数据的方式,以便能够有效地对数据进行操作和处理。
在众多的数据结构中,堆栈和队列是两种非常基础且重要的结构,它们在程序设计和算法实现中有着广泛的应用。
让我们先来聊聊堆栈。
堆栈就像是一个只能从一端进行操作的容器,这个端我们称之为栈顶。
想象一下,你有一堆盘子,每次你放新盘子或者取盘子,都只能在最上面操作,这就是堆栈的基本工作方式。
堆栈遵循“后进先出”(Last In First Out,简称 LIFO)的原则。
也就是说,最后被放入堆栈的元素会首先被取出。
这在很多实际场景中都有体现。
比如,当计算机程序在执行函数调用时,会使用堆栈来保存函数的调用信息。
每次调用一个新函数,相关的信息就被压入堆栈。
当函数执行完毕返回时,相应的信息就从堆栈中弹出。
在程序实现上,堆栈可以通过数组或者链表来实现。
如果使用数组,我们需要确定一个固定的大小来存储元素。
但这种方式可能会存在空间浪费或者溢出的问题。
如果使用链表,虽然可以动态地分配内存,但在操作时需要更多的指针处理,会增加一些复杂性。
接下来,让看看如何对堆栈进行基本的操作。
首先是入栈操作,也称为压栈(Push)。
这就是将一个元素添加到堆栈的栈顶。
比如说,我们有一个初始为空的堆栈,现在要将元素 5 入栈,那么 5 就成为了堆栈的唯一元素,位于栈顶。
然后是出栈操作(Pop),它会移除并返回堆栈栈顶的元素。
继续上面的例子,如果执行出栈操作,就会取出 5,此时堆栈又变为空。
除了入栈和出栈,我们还可以获取栈顶元素(Top),但不会将其从堆栈中移除。
这在很多情况下很有用,比如在进行某些判断或者计算之前,先查看一下栈顶元素是什么。
再来说说队列。
队列和堆栈不同,它就像是在银行排队的队伍,先到的人先接受服务,遵循“先进先出”(First In First Out,简称 FIFO)的原则。
队列有一个队头和一个队尾。
新元素从队尾加入,而从队头取出元素。
《数据结构与算法》习题与答案(解答仅供参考)一、名词解释:1. 数据结构:数据结构是计算机存储、组织数据的方式,它不仅包括数据的逻辑结构(如线性结构、树形结构、图状结构等),还包括物理结构(如顺序存储、链式存储等)。
它是算法设计与分析的基础,对程序的效率和功能实现有直接影响。
2. 栈:栈是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out, LIFO)原则。
在栈中,允许进行的操作主要有两种:压栈(Push),将元素添加到栈顶;弹栈(Pop),将栈顶元素移除。
3. 队列:队列是一种先进先出(First In First Out, FIFO)的数据结构,允许在其一端插入元素(称为入队),而在另一端删除元素(称为出队)。
常见的实现方式有顺序队列和循环队列。
4. 二叉排序树(又称二叉查找树):二叉排序树是一种二叉树,其每个节点的左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。
这种特性使得能在O(log n)的时间复杂度内完成搜索、插入和删除操作。
5. 图:图是一种非线性数据结构,由顶点(Vertex)和边(Edge)组成,用于表示对象之间的多种关系。
根据边是否有方向,可分为有向图和无向图;根据是否存在环路,又可分为有环图和无环图。
二、填空题:1. 在一个长度为n的顺序表中,插入一个新元素平均需要移动______个元素。
答案:(n/2)2. 哈希表利用______函数来确定元素的存储位置,通过解决哈希冲突以达到快速查找的目的。
答案:哈希(Hash)3. ______是最小生成树的一种算法,采用贪心策略,每次都选择当前未加入生成树且连接两个未连通集合的最小权重边。
答案:Prim算法4. 在深度优先搜索(DFS)过程中,使用______数据结构来记录已经被访问过的顶点,防止重复访问。
答案:栈或标记数组5. 快速排序算法在最坏情况下的时间复杂度为______。
数据结构第三章数据结构堆栈和队列在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问和操作这些数据。
在数据结构的众多类型中,堆栈和队列是两种非常重要且常用的结构。
首先,让我们来了解一下堆栈。
堆栈就像是一个垂直堆放的容器,遵循着“后进先出”(Last In First Out,简称LIFO)的原则。
想象一下,你有一堆盘子,每次你把新盘子放在最上面,而当你要取盘子时,也只能从最上面拿。
这就是堆栈的工作方式。
在编程中,堆栈有着广泛的应用。
比如,函数调用就是一个典型的例子。
当一个函数调用另一个函数时,新函数的信息被压入堆栈。
当被调用的函数执行完毕后,其信息从堆栈中弹出,程序回到原来的函数继续执行。
此外,表达式求值也常常会用到堆栈。
例如,计算一个复杂的算术表达式时,可以将操作数和运算符依次压入堆栈,然后按照特定的规则进行计算。
堆栈的实现可以通过数组或者链表来完成。
如果使用数组实现,需要注意堆栈的大小可能会有限制。
而链表实现则相对灵活,但其操作的复杂度可能会略高一些。
接下来,我们再看看队列。
队列则像是一条排队的队伍,遵循“先进先出”(First In First Out,简称 FIFO)的原则。
就好比在银行排队办理业务,先来的人先得到服务并离开队伍。
在实际应用中,队列也非常有用。
例如,打印机的打印任务队列就是一个典型的例子。
新的打印任务被添加到队列的末尾,而打印机按照任务进入队列的顺序依次处理。
还有操作系统中的任务调度,也常常会用到队列来管理等待执行的任务。
队列同样可以通过数组或者链表来实现。
使用数组实现时,可能会面临队列前端元素删除后空间浪费的问题。
而链表实现虽然可以避免这个问题,但需要额外的指针操作。
那么,堆栈和队列在操作上有哪些不同呢?对于堆栈,主要的操作是入栈(push)和出栈(pop)。
入栈就是将元素添加到堆栈的顶部,出栈则是从堆栈的顶部取出元素。
而对于队列,主要的操作是入队(enqueue)和出队(dequeue)。
堆栈、队列和字符串作业3一、单项选择题1.用单链表表示的链式队列的队头在链表的()位置。
(北方名校经典试题)A)链头B)链尾C)链中D)任意【分析】队列的队头是对队列元素进行删除的一端。
对于链队列在链头处进行删除,所以队头在链表的链头位置(不考虑不包含数据元素的头结点)【答案:A】2.栈应用的典型事例是()。
A)排队B)查找C)归并D)用“算符优先法”进行表达式求值【分析】排队、归并与查找一般都不用栈,而用“算符优先法”进行表达式求值必须用栈,是栈的典型应用。
【答案:B】3.若用单链表来表示队列,则应该选用()。
(北方名校经典试题)A)带尾指针的非循环链表B)带尾指针的循环链表C)带头指针的非循环链表D)带头指针的循环链表【分析】设尾指针为Tail,对于循环链表,tail->next为队头,所以应选用带尾指什的循环链表。
【答案:B】4.设有循环队列cq,结构定义如下:#define MAXQSIZE 100 //最大队列长度typedef struct QNode{ElemType *base; //初始化的动态分配空间int front; //头指针,如队列不空,指向队列头元素int rear; //尾指针,如队列不空,指向队列尾元素的下一个位置}SqQueue;SqQueue:cq;则当一个元素入队时指针变化为()。
A)cq.rear= cq.rear+1 B)cq.rear=(cq.rear+1) % MAXQSIZEC)cq.front= cq.front+1 D)cq.front=(cq.front+1) % MAXQSIZE 【分析】队列入队时,元素应追加在队尾,也应是队尾发生变化,由于是循环队列,可知应在同余意义下取值。
【答案:B】2数据结构5.在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,这样主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取出数据打印。
第一节栈
一、栈的定义及其运算
1、栈的定义
栈(Stack):是限定在表的一端进行插入和删除运算的线性表,通常将插入、删除的一端称为栈项(top),另一端称为栈底(bottom)。
不含元素的空表称为空栈。
栈的修改是按后进先出的原则进行的,因此,栈又称为后进先出(Last In First Out)的线性表,简称为LIFO表。
真题选解
(例题·填空题)1、如图所示,设输入元素的顺序是(A,B,C,D),通过栈的变换,在输出端可得到各种排列。
若输出序列的第一个元素为D,则输出序列为。
隐藏答案
【答案】DCBA
【解析】根据堆栈"先进后出"的原则,若输出序列的第一个元素为D,则ABCD入栈,输出序列为DCBA
2、栈的基本运算
(1)置空栈InitStack(&S):构造一个空栈S。