数据结构 栈和队列
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
队头
a2
a3
队尾
入队
队列的操作特性: 先进先出
3.2.2、队列的顺序存储结构
队列的顺序存储结构称为顺序队列
它是利用一组地址连续的存储单元依次存放从队头到队尾的 数据元素,同时利用两个变量分别记录当前队列中队头元素 和队尾元素的位置,这两个变量分别称为队头指针和队尾指 针。队头指针和队尾指针并不一定是指针变量,也可以是下 标变量。在此,用下标变量来描述队列,在初始化空队列时, 队头指针和队尾指针的值都为0;元素入队后,队尾指针增1; 出队列时,队头指针增1。
3.1.4栈的应用
4.栈与递归 递归:函数直接或间接地调用自身叫递归。 实现:建立递归工作栈。 通常函数的调用由栈来实现。函数调用过程中必须做 三件事:①保存现场;②分配存储区;③控制转移。
3.2队列
3.2.1、队列的定义 队列:只允许在一端进行插入操作,而另一端 进行删除操作的线性表。
出队
a1
3.1.4栈的应用
1.数制转换 十进制数N和其他进制数的转换是计算机实现 计算的基本问题,其解决方法很多,其中一个 简单算法基于下列原理: N=(N div d)*d+N mod d 其中,十进制数N要转换为基为d的d进制数, div为整除运算,mod为求余运算。 例如,(1348)10=(2504)8,其运算过程如 图3-6所示。
3.1.4栈的应用
图 3-6
数制转换运算过程
3.1.4栈的应用
其计算过程是从低位到高位顺序产生,但在输 出或打印时,应从高位到底未进行,顺序相 反,因此在运算过程中,将得到的八进制数各 位数顺序进栈,再按出栈顺序输出即可。
3.1.4栈的应用
2.算术表达式的求值 四则运算的规则如下。 (1)先乘除,后加减。 (2)同一个优先级,先左后右。 (3)先括号内,后括号外。
3.1.4栈的应用
3.括号匹配的检验 假设在一个表达式中允许有两种括号:()和[], 那么它们必须能够匹配。[([][])]这种匹配 方法是合法的,而不能出现([]]这种情况。括号 的匹配检验可以用栈来实现,设置一个栈,这个栈只 存放括号,碰到左括号,一律进栈;如果碰到右括号, 从栈中弹出一个左括号;如果它们匹配,接着将下面 的括号进栈,如果不匹配则报错。直到所有的括号输 入完之后结束,如果栈刚好为空,则所有的括号都匹 配(算法实现略)。
3.2.4队列的应用实例
2.CPU资源的竞争问题 在具有多个终端的计算机系统中,有多个用户需要使 用CPU各自运行自己的程序,它们分别通过各自终端 向操作系统提出使用CPU的请求,操作系统按照每个 请求在时间上的先后顺序,将其排成一个队列,每次 把CPU分配给队头用户使用,当相应的程序运行完毕 或用完规定的时间片后,则令其出队,再把CPU分配 给新的队头用户,直到所有用户任务处理完毕。
。
3.1.2 栈的顺序存储结构
顺序栈
顺序栈是用顺序存储结构表示的栈,也就 是利用一组地址连续的存储单元依次存放自 栈底到栈顶的数据元素,并附设一个指针 top 指示栈顶元素后的下一个入栈元素在顺 序栈中的位置。
3.1.3栈的链式存储结构
链栈的操作算法:
初始化 SeqStack( ) 入栈 Push(T x) 出栈 Pop( ) 取栈顶元素 Top( ) 判栈空 Empty( )
3.2.4队列的应用实例
在算法中,假设男士和女士的记录存放在一个数组中 作为输入,然后依次扫描该数组的各元素,并根据性 别来决定是进入男队还是女队。当这两个队列构造完 成之后,依次将两队当前的队头元素出队来配成舞伴, 直至某队列变空为止。此时,若某队仍有等待配对者, 算法输出此队列中等待者的人数及排在队头的等待者 的名字,他(或她)将是下一轮舞曲开始时第一个可 获得舞伴的人。
插入:入栈、进栈、压栈
删除:出栈、弹栈
1、栈的定义
入栈 出栈
栈的示意图
栈顶 栈顶 栈底
a3 a2 a1
插入:入栈、进栈、压栈
删除:出栈、弹栈
栈的操作特性:后进先出
2、栈的基本运算
栈的基本操作除了入栈和出栈外,还有栈的初始化、 取栈顶元素,判空等操作,如下所示。
(1)InitStack(S)。建立一个空栈S。 ( 2 ) StackEmpty(S) 。判断空栈操作,若为空栈,则返回 TRUE,否则返回FALSE。 (3)StackFull(S)。判断栈满,若S为满栈,则返回TRUE, 否则返回FALSE。 (4)Push(S,x)。进栈操作,在S栈顶插入一个元素x。 ( 5 ) Pop(S) 。出栈操作,若栈 S 不为空,栈顶删除一个元 素。 (6)GetTop(S)。取栈顶元素操作。
3.2.3、链队列
非空链队列
head a1
a2
an ∧
rear 空链队列
front
∧
rear
3.2.4队列的应用实例
队列在求解实际问题中有许多重要的应用, 特别是树的按层遍历和图的广度优先遍历就是 借助于队列实现的。
3.2.4队列的应用实例
1.舞伴问题 假设在周末舞会上,男士们和女士们进入舞厅时,各 自排成一队。跳舞开始时,依次从男队和女队的队头 上各出一人配成舞伴。若两队初始人数不相.同,则较 长的那一队中未配对者等待下一轮舞曲。现要求写一 算法模拟上述舞伴配对问题。 问题分析: 先入队的男士或女士亦先出队配成舞伴。 因此该问题具体有典型的先进先出特性,可用队列作 为算法的数据结构。
3.2.2、队列的顺序存储结构
Q.front=Q.rear时表示队列为空。 在循环队列中不能简单地用条件Q.front=Q.rear来判 别队列是否为空(或满)。 我们约定:在循环队列中少用一个数组分量,即若 (Q.rear+1)%Q.size=Q.front,则表示循环队列已满, Q.front=Q.rear,表示空队列。
3.2.2、队列的顺序存储结构
循环队列 1、不存在物理的循环结构,但可用软件方法实现 ——求模 2、如何判断循环队列队空? front=rear 如何判断循环队列队满? front=rear
3.2.2、队列的顺序存储结构
为解决队列看起来似乎已满但实际仍有存储空 间空闲的情况,可将顺序队列视作一个环状的空间, 即数组的第一个(下标为0的)分量被视为数组的 上界分量的下一个元素。如此,当队尾元素已达数 组高端,但队列并未真满,而又要插入数据元素时, 则可将新数据元素插入到数组的第一个分量,这样 处理的队列称之为循环队列,循环队列为常用的顺 序队列。
3.2.2、队列的顺序存储结构
循环队列的操作: (1)初始化 (2)入队 (3)出队 (4)源自文库断队空 (5)判断队满
3.2.2、队列的顺序存储结构
3.2.3、链队列
当队列的最大容量无法估计时,可采用链表 作存储结构,这样的队列称为链队列。 队头指针:指向链表的头结点 队尾指针:指向链表的尾结点
第3章 栈和队列
3.1 栈 3.1.1 栈的定义和基本运算
1、栈的定义
栈:限定仅在表的一端进行插入和删除运算的 线性表(后进先出的线性表) 。 空栈:不含任何数据元素的栈。 允许插入和删除的一端称为栈顶,另一端称为 栈底。
1、栈的定义
入栈 出栈
栈的示意图
栈顶
栈顶
栈顶 栈底
a3 a2 a1
a2
a3
队尾
入队
队列的操作特性: 先进先出
3.2.2、队列的顺序存储结构
队列的顺序存储结构称为顺序队列
它是利用一组地址连续的存储单元依次存放从队头到队尾的 数据元素,同时利用两个变量分别记录当前队列中队头元素 和队尾元素的位置,这两个变量分别称为队头指针和队尾指 针。队头指针和队尾指针并不一定是指针变量,也可以是下 标变量。在此,用下标变量来描述队列,在初始化空队列时, 队头指针和队尾指针的值都为0;元素入队后,队尾指针增1; 出队列时,队头指针增1。
3.1.4栈的应用
4.栈与递归 递归:函数直接或间接地调用自身叫递归。 实现:建立递归工作栈。 通常函数的调用由栈来实现。函数调用过程中必须做 三件事:①保存现场;②分配存储区;③控制转移。
3.2队列
3.2.1、队列的定义 队列:只允许在一端进行插入操作,而另一端 进行删除操作的线性表。
出队
a1
3.1.4栈的应用
1.数制转换 十进制数N和其他进制数的转换是计算机实现 计算的基本问题,其解决方法很多,其中一个 简单算法基于下列原理: N=(N div d)*d+N mod d 其中,十进制数N要转换为基为d的d进制数, div为整除运算,mod为求余运算。 例如,(1348)10=(2504)8,其运算过程如 图3-6所示。
3.1.4栈的应用
图 3-6
数制转换运算过程
3.1.4栈的应用
其计算过程是从低位到高位顺序产生,但在输 出或打印时,应从高位到底未进行,顺序相 反,因此在运算过程中,将得到的八进制数各 位数顺序进栈,再按出栈顺序输出即可。
3.1.4栈的应用
2.算术表达式的求值 四则运算的规则如下。 (1)先乘除,后加减。 (2)同一个优先级,先左后右。 (3)先括号内,后括号外。
3.1.4栈的应用
3.括号匹配的检验 假设在一个表达式中允许有两种括号:()和[], 那么它们必须能够匹配。[([][])]这种匹配 方法是合法的,而不能出现([]]这种情况。括号 的匹配检验可以用栈来实现,设置一个栈,这个栈只 存放括号,碰到左括号,一律进栈;如果碰到右括号, 从栈中弹出一个左括号;如果它们匹配,接着将下面 的括号进栈,如果不匹配则报错。直到所有的括号输 入完之后结束,如果栈刚好为空,则所有的括号都匹 配(算法实现略)。
3.2.4队列的应用实例
2.CPU资源的竞争问题 在具有多个终端的计算机系统中,有多个用户需要使 用CPU各自运行自己的程序,它们分别通过各自终端 向操作系统提出使用CPU的请求,操作系统按照每个 请求在时间上的先后顺序,将其排成一个队列,每次 把CPU分配给队头用户使用,当相应的程序运行完毕 或用完规定的时间片后,则令其出队,再把CPU分配 给新的队头用户,直到所有用户任务处理完毕。
。
3.1.2 栈的顺序存储结构
顺序栈
顺序栈是用顺序存储结构表示的栈,也就 是利用一组地址连续的存储单元依次存放自 栈底到栈顶的数据元素,并附设一个指针 top 指示栈顶元素后的下一个入栈元素在顺 序栈中的位置。
3.1.3栈的链式存储结构
链栈的操作算法:
初始化 SeqStack( ) 入栈 Push(T x) 出栈 Pop( ) 取栈顶元素 Top( ) 判栈空 Empty( )
3.2.4队列的应用实例
在算法中,假设男士和女士的记录存放在一个数组中 作为输入,然后依次扫描该数组的各元素,并根据性 别来决定是进入男队还是女队。当这两个队列构造完 成之后,依次将两队当前的队头元素出队来配成舞伴, 直至某队列变空为止。此时,若某队仍有等待配对者, 算法输出此队列中等待者的人数及排在队头的等待者 的名字,他(或她)将是下一轮舞曲开始时第一个可 获得舞伴的人。
插入:入栈、进栈、压栈
删除:出栈、弹栈
1、栈的定义
入栈 出栈
栈的示意图
栈顶 栈顶 栈底
a3 a2 a1
插入:入栈、进栈、压栈
删除:出栈、弹栈
栈的操作特性:后进先出
2、栈的基本运算
栈的基本操作除了入栈和出栈外,还有栈的初始化、 取栈顶元素,判空等操作,如下所示。
(1)InitStack(S)。建立一个空栈S。 ( 2 ) StackEmpty(S) 。判断空栈操作,若为空栈,则返回 TRUE,否则返回FALSE。 (3)StackFull(S)。判断栈满,若S为满栈,则返回TRUE, 否则返回FALSE。 (4)Push(S,x)。进栈操作,在S栈顶插入一个元素x。 ( 5 ) Pop(S) 。出栈操作,若栈 S 不为空,栈顶删除一个元 素。 (6)GetTop(S)。取栈顶元素操作。
3.2.3、链队列
非空链队列
head a1
a2
an ∧
rear 空链队列
front
∧
rear
3.2.4队列的应用实例
队列在求解实际问题中有许多重要的应用, 特别是树的按层遍历和图的广度优先遍历就是 借助于队列实现的。
3.2.4队列的应用实例
1.舞伴问题 假设在周末舞会上,男士们和女士们进入舞厅时,各 自排成一队。跳舞开始时,依次从男队和女队的队头 上各出一人配成舞伴。若两队初始人数不相.同,则较 长的那一队中未配对者等待下一轮舞曲。现要求写一 算法模拟上述舞伴配对问题。 问题分析: 先入队的男士或女士亦先出队配成舞伴。 因此该问题具体有典型的先进先出特性,可用队列作 为算法的数据结构。
3.2.2、队列的顺序存储结构
Q.front=Q.rear时表示队列为空。 在循环队列中不能简单地用条件Q.front=Q.rear来判 别队列是否为空(或满)。 我们约定:在循环队列中少用一个数组分量,即若 (Q.rear+1)%Q.size=Q.front,则表示循环队列已满, Q.front=Q.rear,表示空队列。
3.2.2、队列的顺序存储结构
循环队列 1、不存在物理的循环结构,但可用软件方法实现 ——求模 2、如何判断循环队列队空? front=rear 如何判断循环队列队满? front=rear
3.2.2、队列的顺序存储结构
为解决队列看起来似乎已满但实际仍有存储空 间空闲的情况,可将顺序队列视作一个环状的空间, 即数组的第一个(下标为0的)分量被视为数组的 上界分量的下一个元素。如此,当队尾元素已达数 组高端,但队列并未真满,而又要插入数据元素时, 则可将新数据元素插入到数组的第一个分量,这样 处理的队列称之为循环队列,循环队列为常用的顺 序队列。
3.2.2、队列的顺序存储结构
循环队列的操作: (1)初始化 (2)入队 (3)出队 (4)源自文库断队空 (5)判断队满
3.2.2、队列的顺序存储结构
3.2.3、链队列
当队列的最大容量无法估计时,可采用链表 作存储结构,这样的队列称为链队列。 队头指针:指向链表的头结点 队尾指针:指向链表的尾结点
第3章 栈和队列
3.1 栈 3.1.1 栈的定义和基本运算
1、栈的定义
栈:限定仅在表的一端进行插入和删除运算的 线性表(后进先出的线性表) 。 空栈:不含任何数据元素的栈。 允许插入和删除的一端称为栈顶,另一端称为 栈底。
1、栈的定义
入栈 出栈
栈的示意图
栈顶
栈顶
栈顶 栈底
a3 a2 a1