数据结构 第 3 章 栈和队列_第1页
数据结构 第 3 章 栈和队列_第2页
数据结构 第 3 章 栈和队列_第3页
数据结构 第 3 章 栈和队列_第4页
数据结构 第 3 章 栈和队列_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据结构数据结构 第三章第三章 栈和队列栈和队列 数据结构数据结构 第三章第三章 栈和队列栈和队列 1、栈和队列的定义及特点;、栈和队列的定义及特点; 2、栈的顺序存储表示;、栈的顺序存储表示; 3、队列的顺序存储表示;队列的链接存储表示;、队列的顺序存储表示;队列的链接存储表示; 4、栈和队列的应用举例。、栈和队列的应用举例。 教学内容教学内容 数据结构数据结构 第三章第三章 栈和队列栈和队列 限定仅在表尾进行插入或删除操作。限定仅在表尾进行插入或删除操作。 3.1 栈栈 3.1.1 抽象数据类型栈的定义抽象数据类型栈的定义 栈的定义栈的定义 a1 a2 an-1 an 栈顶栈顶 (top)

2、 栈底栈底 (bottom) 出栈出栈 进栈进栈 栈底元素栈底元素 线性表线性表 后进先出后进先出 (LIFO结构结构)。 数据结构数据结构 第三章第三章 栈和队列栈和队列 栈的抽象数据类型的定义栈的抽象数据类型的定义 ADT Stack 数据对象:数据对象:D ai | ai ElemSet, i = 1, 2, ., n, n0 数据关系:数据关系:R1 | ai-1, aiD, i = 2, ., n 约定约定an 端为栈顶,端为栈顶,a1 端为栈底。端为栈底。 基本操作:基本操作: 操作结果:操作结果:构造一个空栈构造一个空栈 S。 初始条件:初始条件:栈栈 S 已存在。已存在。 操作

3、结果:操作结果:栈栈 S 被销毁。被销毁。 数据结构数据结构 第三章第三章 栈和队列栈和队列 初始条件:初始条件:栈栈 S 已存在且非空。已存在且非空。 操作结果:操作结果:用用 e 返回返回 S 的栈顶元素。的栈顶元素。 初始条件:初始条件:栈栈 S 已存在。已存在。 操作结果操作结果:若栈若栈 S 为空栈,则返回为空栈,则返回 TRUE,否则,否则 FALSE。 初始条件初始条件:栈栈 S 已存在。已存在。 操作结果:操作结果:返回返回 S 的元素个数,即栈的长度。的元素个数,即栈的长度。 数据结构数据结构 第三章第三章 栈和队列栈和队列 初始条件:初始条件:栈栈 S 已存在。已存在。 操

4、作结果:操作结果:将将 S 清为空栈。清为空栈。 初始条件:初始条件:栈栈 S 已存在。已存在。 操作结果:操作结果:插入元素插入元素 e 为新的栈顶元素。为新的栈顶元素。 初始条件:初始条件:栈栈 S 已存在且非空。已存在且非空。 操作结果:操作结果:删除删除 S 的栈顶元素,并用的栈顶元素,并用 e 返回其值。返回其值。 ADT Stack 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.1.2 栈的表示和实现栈的表示和实现 顺序栈顺序栈 利用一组地址连续的存储单元依次存放自利用一组地址连续的存储单元依次存放自 栈底到栈顶的数据元素,同时附设指针栈底到栈顶的数据元素,同时附设指针 t

5、op 指示栈顶元指示栈顶元 素在顺序栈中的位置。素在顺序栈中的位置。 top base A top B top C top D top E top 若再进行元若再进行元 素素“出栈出栈”操操 作,将产生作,将产生 “下溢下溢”。 top 若再进行元若再进行元 素素“入栈入栈”操操 作,将产生作,将产生 “上溢上溢”。 数据结构数据结构 第三章第三章 栈和队列栈和队列 #define LIST_INIT_SIZE 100 / 线性表存储空间的初始分配量线性表存储空间的初始分配量 #define LISTINCREMENT 10 / 线性表存储空间的分配增量线性表存储空间的分配增量 typedef

6、 struct ElemType *elem; / 数组指针,指示线性表的基地址数组指针,指示线性表的基地址 int length; / 当前长度当前长度 int listsize; / 当前分配的存储容量当前分配的存储容量(以以sizeof(ElemType)为单位为单位) SqList; SelemType *base; / 栈底指针,它始终指向栈底的位置。栈底指针,它始终指向栈底的位置。 SelemType *top; / 栈顶指针。栈顶指针。 int stacksize; / 当前分配的栈可使用的最大存储容量。当前分配的栈可使用的最大存储容量。 Sqstack; base 的值为的值为

7、 NULL,表明栈结构不存在。,表明栈结构不存在。 #define STACK_INIT_SIZE 100 / 栈存储空间的初始分配量栈存储空间的初始分配量 #define STACKINCREMENT 10 / 栈存储空间的分配增量栈存储空间的分配增量 数据结构数据结构 第三章第三章 栈和队列栈和队列 栈的基本操作在顺序栈中的实现栈的基本操作在顺序栈中的实现 #define maxs 9; main() while(top0) e=stacktop-1; top-=1; InitStack Push Pop top 1 2 top top top 2 top GetTop 2 1 Statu

8、s InitStack (SqStack if (!S.base) exit (OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; / InitStack Status Push (SqStack if (!S.base) exit (OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; * S.top + = e; return OK; / Push Status GetTop (SqStack S, SElemTyp

9、e e = *(S.top 1); return OK; / GetTop Status Pop (SqStack e = * - S.top; return OK; / Pop 数据结构数据结构 第三章第三章 栈和队列栈和队列 栈顶指针栈顶指针 链栈链栈 an 注意注意: : 链栈中指针的方向链栈中指针的方向 an-1 a1 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.2 栈的应用举例栈的应用举例 3.2.1 数制转换数制转换 十进制数十进制数 N 和其他和其他 d 进制数进制数 M 的转换是计算机实现的转换是计算机实现 计算的基本问题,其解决方法很多,其中一个简单算法是计算的基本

10、问题,其解决方法很多,其中一个简单算法是 逐次除以基数逐次除以基数 d 取余法,它基于下列原理:取余法,它基于下列原理: N = (N div d )*d + N mod d 具体作法为:具体作法为:首先用首先用 N 除以除以 d,得到的余数是,得到的余数是 d 进制进制 数数 M 的最低位的最低位 M0, 接着以前一步得到的商作为被除数,接着以前一步得到的商作为被除数, 再除以再除以 d,得到的余数是,得到的余数是 d 进制数进制数 M 的次最低位的次最低位 M1,依,依 次类推,直到商为次类推,直到商为 0 时得到的余数是时得到的余数是 M 的最高位的最高位 Ms(假(假 定定 M 共有共

11、有 s +1 位)。位)。 数据结构数据结构 第三章第三章 栈和队列栈和队列 例:例: (1348)10=(2504)8,其运算过程如下:,其运算过程如下: N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2 计计 算算 顺顺 序序 输输 出出 顺顺 序序 数据结构数据结构 第三章第三章 栈和队列栈和队列 bottom top 4 0 5 2 top 1348 168 void conversion () int stack4; int top=0; int N; scanf(“%d”, N); while (N) stacktop=N%8;

12、top+; N=N/8; for(top=top-1; top=0; top-) printf(“%d”,stacktop); 21 top 2 top 0 top 2504 InitStack(S) Push(S, N%S) While (!Stackempty(S) Pop(S, e); printf(“%d”, e); 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.2.2 括号匹配的检验括号匹配的检验 假设表达式中允许括号嵌套,则检验括号是否匹配的假设表达式中允许括号嵌套,则检验括号是否匹配的 方法可用方法可用“期待的急迫程度期待的急迫程度”这个概念来描述。这个概念来描述。 例:

13、例: ( ) 1 2 3 4 5 6 7 8 bottom top ( top top top top top top top top 可能出现的可能出现的的情况:的情况: 盼来的右括号盼来的右括号不是所不是所“期待期待”的;的; 到来的是到来的是“不速之客不速之客” (右括号多右括号多); 到结束也未盼来到结束也未盼来所所“期待期待”的括号的括号 (左括号多左括号多)。)。 数据结构数据结构 第三章第三章 栈和队列栈和队列 算法的设计思想:算法的设计思想: 1)凡出现)凡出现左括号左括号,则,则进栈进栈; 2)凡出现右括号,首先检查栈是否空。)凡出现右括号,首先检查栈是否空。 若栈空,则表明

14、该若栈空,则表明该“右括号右括号”多余;多余; 否则和栈顶元素比较,否则和栈顶元素比较, 若相匹配,则若相匹配,则“左括号出栈左括号出栈”, 否则表明不匹配。否则表明不匹配。 3)表达式检验结束时,)表达式检验结束时, 若栈空,则表明表达式中匹配正确,若栈空,则表明表达式中匹配正确, 否则表明否则表明“左括号左括号”有多余的。有多余的。 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.2.3 行编辑程序行编辑程序 接受用户从终端输入的数据并存入用户的数据区。接受用户从终端输入的数据并存入用户的数据区。 bottom top top top 接受一个字符即存入数据区。接受一个字符即存入数据

15、区。(!难纠错。)!难纠错。) 设一个输入缓冲区,接受完一行字符后再存入用设一个输入缓冲区,接受完一行字符后再存入用 户的数据区。户的数据区。 (!可及时纠错。)!可及时纠错。) # 退格符,表示前一个字符无效。退格符,表示前一个字符无效。 退行符,表示整行字符均无效。退行符,表示整行字符均无效。 例:例:接受的字符为:接受的字符为: whli#ile outchputch 实际有效的为:实际有效的为: while putch w h l top i top top top i top l e top top 数据结构数据结构 第三章第三章 栈和队列栈和队列 void LineEdit( )

16、InitStack(S); ch=getchar(); while (ch != EOF) /EOF为全文结束符为全文结束符 while (ch != EOF break; case : ClearStack(S); break; / 重置重置S为空栈为空栈 default : Push(S, ch); break; ch = getchar(); / 从终端接收下一个字符从终端接收下一个字符 将从栈底到栈顶的字符传送至调用过程的数据区;将从栈底到栈顶的字符传送至调用过程的数据区; ClearStack(S); / 重置重置S为空栈为空栈 if (ch != EOF) ch = getchar

17、(); DestroyStack(S); 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.2.4 迷宫求解迷宫求解 出口出口 入入 口口 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 11 12 22 32 33 34 24 25 26 16 15 14 31 41 51 52 53 63 64 65 75 85 86 87 求迷宫路径算法的基本思想:求迷宫路径算法的基本思想: 若当前位置若当前位置“可通可通”,则纳入路径,继续前进;,则纳入路径,继续前进; 若当前位置若当前位置“不可通不可通”,则后退,换方向(按东南西北,则后退,换方向(按东南西北 的

18、顺序)继续探索;的顺序)继续探索; 若四周若四周“均无通路均无通路”,则将当前位置从路径中删除出去。,则将当前位置从路径中删除出去。 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.2.5 表达式求值表达式求值 运算规则运算规则 先乘除,后加减;先乘除,后加减; 从左算到右;从左算到右; 先括号内,后括号外;先括号内,后括号外; 例:例:求表达式求表达式 4+2 3-10/5 的值。的值。 计算顺序为:计算顺序为:4+2 3-10/5=4+6-10/5=10-10/5=10-2=8 操作数或结果操作数或结果 运算符运算符 # 4 + 2 3 6 10 - 10 / 5 8 2 数据结构数

19、据结构 第三章第三章 栈和队列栈和队列 “四染色四染色”定理是计算机科学中著名定理之一,定理是计算机科学中著名定理之一, 即可以用不多于四种颜色对地图着色,使相邻的行政即可以用不多于四种颜色对地图着色,使相邻的行政 区域不重色。区域不重色。 补充:地图四染色问题补充:地图四染色问题 算法思想:算法思想:从第一号行政区开始逐一染色,每一从第一号行政区开始逐一染色,每一 个区域逐次用颜色个区域逐次用颜色 1、2、3、4 进行试探。若当前所进行试探。若当前所 取的色数与周围已染色的行政区不重色,则用栈记下取的色数与周围已染色的行政区不重色,则用栈记下 该行政区的色数,否则依次用下一色数进行试探;若该

20、行政区的色数,否则依次用下一色数进行试探;若 出现用出现用 1 至至 4 色均与相邻区域发生重色,则需退栈回色均与相邻区域发生重色,则需退栈回 溯,修改当前栈顶的色数,再进行试探。直至所有行溯,修改当前栈顶的色数,再进行试探。直至所有行 政区域都已分配合适的颜色。政区域都已分配合适的颜色。 数据结构数据结构 第三章第三章 栈和队列栈和队列 例例:已知:已知 7 个行政区域地图,对其进行染色。个行政区域地图,对其进行染色。 1 2 3 4 5 6 7 1 0 1 1 1 1 1 0 21 0 0 0 0 1 0 31 0 0 1 1 0 0 41 0 1 0 1 1 0 51 0 1 1 0 1

21、 0 61 1 0 1 1 0 0 7 0 0 0 0 0 0 0 1 2 3 4 1 2 3 4 5 6 7 1 2 2 3 4 4 3 1 (3) (1)(2) (4) (5) (6) (7) 3 2 4 3 数据结构数据结构 第三章第三章 栈和队列栈和队列 作业:作业: 3.1、3.2、3.3、3.4、3.18 选择题部分选择题部分 1、若入栈序列是、若入栈序列是 a, b, c, d, e,则不可能的出栈序列是()。,则不可能的出栈序列是()。 (A) edcba(B)decba(C)dceab (D)abcde 2、判定一个栈、判定一个栈 ST(最多元素为最多元素为m0) 为空的条件

22、是()。为空的条件是()。 (A) ST.top != 0 (B)ST.top = 0 (C)ST.top != m0 (D)ST.top = m0 3、判定一个栈、判定一个栈 ST(最多元素为最多元素为m0) 为满的条件是()。为满的条件是()。 (A)ST.top != 0 (B)ST.top = 0 (C)ST.top != m0 (D)ST.top = m0 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.3 栈与递归的实现栈与递归的实现 递归:递归:一个直接调用自己或通过一系列的调用语句间接地调一个直接调用自己或通过一系列的调用语句间接地调 用自己的函数,称做递归函数。用自己的

23、函数,称做递归函数。 例:例:阶乘函数阶乘函数 0)1( 01 )( n nFactn n nFact 若若 若若 相应的相应的 C 语言函数是:语言函数是: float fact(int n) float s; if (n = = 0) s = 1; else s = n*fact(n -1); return (s); 若求若求 5!,则有,则有 main() printf(“5!=%fn”,fact(5); 数据结构数据结构 第三章第三章 栈和队列栈和队列 当在一个函数的运行期间调用另一个函数时,在运行当在一个函数的运行期间调用另一个函数时,在运行 该被调用函数之前,需先完成三件事:该被调

24、用函数之前,需先完成三件事: 1. 将实参等传递给被调用函数,将实参等传递给被调用函数,(); 2. 为被调用函数的局部变量为被调用函数的局部变量分配存储区分配存储区; 3. 将将控制转移控制转移到被调用函数的入口。到被调用函数的入口。 从被调用函数返回调用函数之前,应该完成:从被调用函数返回调用函数之前,应该完成: 1. 保存保存被调函数的被调函数的计算结果计算结果; 2. 释放释放被调函数的被调函数的数据区数据区; 3. 按被调函数保存的返回地址(按被调函数保存的返回地址()将)将控制转移控制转移到调到调 用函数。用函数。 多个函数嵌套调用的规则是:多个函数嵌套调用的规则是:。 此时的内存

25、管理实行此时的内存管理实行“”。 数据结构数据结构 第三章第三章 栈和队列栈和队列 float fact(int n) float s; if (n = = 0) s =1; else s = n*fact(n -1); return (s); 递归调用执行过程:递归调用执行过程: 主函数主函数 main() Printf(fact(5) 第一层调用第一层调用 n = 5 s = 5*fact(4) 第二层调用第二层调用 n = 4 s = 4*fact(3) 第三层调用第三层调用 n = 3 s = 3*fact(2) 第四层调用第四层调用 n = 2 s = 2*fact(1) 第五层调用

26、第五层调用 n = 1 s = 1*fact(0) fact(5)=120输出输出 s = 120.00 第六层调用第六层调用 n = 0 s = 1 fact(4)=24fact(3)=6 fact(2)=2fact(1)=1fact(0)=1 主主 a 5 a 4 a 3 a 2 a 1 a printf(“5!=%fn”,fact(5); base float fact(int n) float s; if (n = = 0) s =1; else s = n*fact(n -1); return (s); float fact(int n) float s; if (n = = 0)

27、s =1; else s = n*fact(n -1); return (s); float fact(int n) float s; if (n = = 0) s =1; else s = n*fact(n -1); return (s); float fact(int n) float s; if (n = = 0) s =1; else s = n*fact(n -1); return (s); float fact(int n) float s; if (n = = 0) s =1; else s = n*fact(n -1); return (s); n = 5 n = 4 n =

28、3 n = 2 n = 1 n = 0 数据结构数据结构 第三章第三章 栈和队列栈和队列 限定在表的一端插入、另一端删除。限定在表的一端插入、另一端删除。 3.4 队列队列 3.4.1 抽象数据类型队列的定义抽象数据类型队列的定义 队列的定义队列的定义 线性表线性表 先进先出先进先出 (FIFO结构结构)。 队头队头 下图是队列的示意图:下图是队列的示意图: a1a2 an 出队出队 入队入队 队头队头 队尾队尾 当队列中没有元素时称为当队列中没有元素时称为空队列空队列。 数据结构数据结构 第三章第三章 栈和队列栈和队列 队列的抽象数据类型的定义队列的抽象数据类型的定义 ADT Queue 数

29、据对象:数据对象:Dai | aiElemSet, i =1, 2, ., n, n0 数据关系:数据关系:R1 | ai -1, ai D, i =2, ., n 约定其中约定其中 a1 端为队列头,端为队列头,an 端为队列尾。端为队列尾。 基本操作:基本操作: 操作结果:操作结果:构造一个空队列构造一个空队列 Q。 初始条件:初始条件:队列队列 Q 已存在。已存在。 操作结果:操作结果:队列队列 Q 被销毁,不再存在。被销毁,不再存在。 数据结构数据结构 第三章第三章 栈和队列栈和队列 初始条件:初始条件:队列队列 Q 已存在。已存在。 操作结果:操作结果:若若 Q 为空队列,则返回为空

30、队列,则返回 TRUE, 否则返回否则返回 FALSE。 初始条件:初始条件:队列队列 Q 已存在。已存在。 操作结果:操作结果:返回返回 Q 的元素个数,即队列的长度。的元素个数,即队列的长度。 初始条件:初始条件:Q 为非空队列。为非空队列。 操作结果:操作结果:用用 e 返回返回 Q 的队头元素。的队头元素。 数据结构数据结构 第三章第三章 栈和队列栈和队列 初始条件:初始条件:队列队列 Q 已存在。已存在。 操作结果:操作结果:将将 Q 清为空队列。清为空队列。 初始条件:初始条件:队列队列 Q 已存在。已存在。 操作结果:操作结果:插入元素插入元素 e 为为 Q 的新的队尾元素。的新

31、的队尾元素。 初始条件:初始条件:Q 为非空队列。为非空队列。 操作结果:操作结果:删除删除 Q 的队头元素,并用的队头元素,并用 e 返回其值。返回其值。 ADT Queue 数据结构数据结构 第三章第三章 栈和队列栈和队列 双端队列双端队列 限定插入和删除在表的两端进行。限定插入和删除在表的两端进行。 线性表线性表 先进先出先进先出 (FIFO结构结构)。 端点 端点 1 端点端点 2 下图是双端队列的示意图:下图是双端队列的示意图: a1a2 an 出队出队 入队入队 端点端点 1 端点端点 2 出队出队 入队入队 一个端点可插入和删除,一个端点可插入和删除, 另一个端点仅可插入。另一个

32、端点仅可插入。 一个端点可插入和删除,一个端点可插入和删除, 另一个端点仅可删除。另一个端点仅可删除。 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.4.2 链队列链队列队列的链式表示和实现队列的链式表示和实现 用链表表示的队列。用链表表示的队列。 是限制仅在表头删除和表尾插入的单链表。是限制仅在表头删除和表尾插入的单链表。 。 (因为仅有头指针不便于在表尾做插入操作)。(因为仅有头指针不便于在表尾做插入操作)。 为了操作的方便,也给链队列添加一个头结点,为了操作的方便,也给链队列添加一个头结点, 因此,空队列的判定条件是:因此,空队列的判定条件是: front rear rear f

33、ront 图图3-12 链队列示意图链队列示意图 队头队头 队尾队尾 数据结构数据结构 第三章第三章 栈和队列栈和队列 用用 C 语言定义链队列结构如下:语言定义链队列结构如下: typedef struct QNode QElemtype data; struct QNode *next; Qnode, *QueuePtr; / 定义队列的结点定义队列的结点 typedef struct QueuePtr *front; / 队头指针队头指针 QueuePtr *rear; / 队尾指针队尾指针 LinkQueue; 数据结构数据结构 第三章第三章 栈和队列栈和队列 Status InitQ

34、ueue (LinkQueue if (!Q.front) exit (OVERFLOW);/ 存储分配失败存储分配失败 Q.front - next = NULL; return OK; 队列的基本操作在链队列中的实现:队列的基本操作在链队列中的实现: 队列的初始化:队列的初始化: 数据结构数据结构 第三章第三章 栈和队列栈和队列 a1a2a3 Q.front Q.rear 销毁队列:销毁队列: = null = null Status DestroQueue (LinkQueue free (Q.front); Q.front = Q.rear; return OK; 数据结构数据结构 第

35、三章第三章 栈和队列栈和队列 rear front xy 插入操作在链队列中的实现插入操作在链队列中的实现 p p Status EnQueue (LinkQueue if (!p) exit (OVERFLOW); p - data = e; p - next = NULL; Q.rear - next = p; Q.rear = p; return OK; 数据结构数据结构 第三章第三章 栈和队列栈和队列 Status DeQueue (LinkQueue p = Q.front - next; e = p - data; Q.front - next = p - next; if (Q.

36、rear = p) Q.rear = Q.front; free (p); return OK; front rear y x 删除操作在链队列中的实现删除操作在链队列中的实现 p p 数据结构数据结构 第三章第三章 栈和队列栈和队列 填空题部分填空题部分 1、栈的特点是(、栈的特点是( ),队列的特点是(),队列的特点是( )。)。 2、线性表、栈和队列都是(、线性表、栈和队列都是( )结构,可以在线性表的()结构,可以在线性表的( ) 位置插入和删除元素,栈只能在(位置插入和删除元素,栈只能在( )插入和删除元素,)插入和删除元素, 队列只能在(队列只能在( )插入元素和()插入元素和(

37、)删除元素。)删除元素。 3、设栈、设栈 S 和队列和队列 Q 的初始状态皆为空,元素的初始状态皆为空,元素a1, a2, a3, a4, a5 和和 a6 依次通过一个栈,一个元素出栈后即进入队列依次通过一个栈,一个元素出栈后即进入队列 Q,若,若 6 个元素出队列的顺序是个元素出队列的顺序是 a3, a5, a4, a6, a2, a1 则栈则栈 S 至少应至少应 该容纳该容纳 ( ) 个元素。个元素。 4、若队列的入队序列是、若队列的入队序列是 1, 2, 3, 4,则出队序列是()。,则出队序列是()。 (A)4,3,2,1(B)1,2,3,4(C)1,4,3,2(D)3,2,4,1

38、作业作业 3.11、3.12 数据结构数据结构 第三章第三章 栈和队列栈和队列 3.4.3 循环队列队列的顺序表示和实现循环队列队列的顺序表示和实现 是限制仅在表头删除和表尾插入的顺序表。是限制仅在表头删除和表尾插入的顺序表。 头尾头尾 指针指针 利用一组利用一组的存储单元的存储单元队列中的数据元素。队列中的数据元素。 rear front rear front J1 J2 J3 头、尾指针和队列元素之间的关系头、尾指针和队列元素之间的关系 rear front J3 rear front 在非空队列里,头指针始终指向队头元素在非空队列里,头指针始终指向队头元素 尾指针始终指向队尾元素的下一位

39、置。尾指针始终指向队尾元素的下一位置。 因为:因为:队头和队尾的位置是变化的队头和队尾的位置是变化的所以:所以:设设头、尾指针。头、尾指针。 初始化时的初始值均应置为初始化时的初始值均应置为 0。 入队,尾指针增入队,尾指针增 1 出队,头指针增出队,头指针增 1 数据结构数据结构 第三章第三章 栈和队列栈和队列 在顺序队列中,当尾指针已经指向了队列的最后一个在顺序队列中,当尾指针已经指向了队列的最后一个 位置的下一位置时,若再有元素入队,就会发生位置的下一位置时,若再有元素入队,就会发生“”。 “”队列的存储空间未满,却发生了溢出。队列的存储空间未满,却发生了溢出。 rear front J

40、1 J2 J3 J4 rear front J3 J4 (1)、平移元素:把元素平移到队列的首部。、平移元素:把元素平移到队列的首部。 解决解决“假溢出假溢出”的问题有两种可行的方法:的问题有两种可行的方法: (2)、将新元素插入到第一个位置上,构成、将新元素插入到第一个位置上,构成循环队列循环队列, 入队和出队仍按入队和出队仍按“先进先出先进先出”的原则进行。的原则进行。 。 rear front J3 J4 front rear J3 J4 数据结构数据结构 第三章第三章 栈和队列栈和队列 循环队列的三种状态:循环队列的三种状态: 0 1 2 3 4 5 0 1 2 3 4 5 J5 J4

41、 J3 front rear 0 1 2 3 4 5 J5 J4 J3 J6 J7 J8 front rear 仅凭仅凭 front = rear 不能判定队列是不能判定队列是还是还是满满。 解决办法:解决办法: (1)、另设一个布尔变量以区别队列的空和满;、另设一个布尔变量以区别队列的空和满; (2)、少用一个元素的空间,约定入队前测试尾指针在循环、少用一个元素的空间,约定入队前测试尾指针在循环 意义下加意义下加 1 后是否等于头指针,若相等则认为队满;后是否等于头指针,若相等则认为队满; (3)、使用一个计数器记录队列中元素的总数。、使用一个计数器记录队列中元素的总数。 数据结构数据结构

42、第三章第三章 栈和队列栈和队列 #define MAXQSIZE 100 /最大队列长度最大队列长度 typedef struct QElemType *base; / 预分配存储空间基址预分配存储空间基址 int front; / 头指针,若队列不空,头指针,若队列不空, / 指向队列头元素指向队列头元素 int rear; / 尾指针,若队列不空,尾指针,若队列不空, / 指向队列尾元素指向队列尾元素 的下一个位置的下一个位置 SqQueue; 队列的顺序存储结构:队列的顺序存储结构: 数据结构数据结构 第三章第三章 栈和队列栈和队列 循环意义下的加循环意义下的加 1 操作可以描述为:操作

43、可以描述为: if (rear + 1 MAXQSIZE) rear = 0; else rear +; 0 1 2 3 4 5 J5 J4 J3 rear front 利用模运算可简化为:利用模运算可简化为:rear = (rear + 1)% MAXQSIZE 数据结构数据结构 第三章第三章 栈和队列栈和队列 Status InitQueue (SqQueue if (!Q.base) exit (OVERFLOW); / 存储分配失败存储分配失败 Q.front = Q.rear = 0; return OK; 队列的基本操作在循环队列中的实现:队列的基本操作在循环队列中的实现: 队列的

44、初始化:队列的初始化: 数据结构数据结构 第三章第三章 栈和队列栈和队列 Status QueueLength (SqQueue Q) / 返回队列返回队列 Q 的元素个数的元素个数 return (Q.rear - Q.front); Status QueueLength (SqQueue Q) / 返回队列返回队列 Q 的元素个数的元素个数 return (Q.rear - Q.front ; 求循环队列的长度求循环队列的长度 考虑到循环队列考虑到循环队列 front rear J3 J4 front rear J3 J1 J2 数据结构数据结构 第三章第三章 栈和队列栈和队列 Statu

45、s EnQueue (SqQueue Q.rear = (Q.rear + 1) % MAXQSIZE; return OK; Status EnQueue (SqQueue / 队列满队列满 Q.baseQ.rear = e; Q.rear = (Q.rear + 1) % MAXQSIZE; return OK; 插入操作在循环队列中的实现插入操作在循环队列中的实现 front rear J3 J4 J5 rear 数据结构数据结构 第三章第三章 栈和队列栈和队列 Status DeQueue (SqQueue 否则返回否则返回 ERROR if (Q.front = Q.rear) re

46、turn ERROR; e = Q.baseQ.front; Q.front = (Q.front + 1) % MAXQSIZE; return OK; 删除操作在循环队列中的实现删除操作在循环队列中的实现 rear front front rear J3 J1 J2 front 数据结构数据结构 第三章第三章 栈和队列栈和队列 队列的应用队列的应用 1 1 2 2 1 2 1 3 3 1 3 3 1 4 4 1 4 6 4 1利用循环队列的计算过程:利用循环队列的计算过程: 假设只计算假设只计算 2 行,行, 队列的最大容量为队列的最大容量为 5。 front 01 front 2 11 front 2 1 11 front 2 1 0 0 1 front 补例补例 1:杨辉三角的计算杨辉三角的计算 数据结构数据结构 第三章第三章 栈和队列栈和队列 补例补例 2:CPU 资源的竞争问题资源的竞争问题 在多用户计算机系统中,各个用户需要使用在多用户计算机系统

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论