版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、队列及其应用数 据 结 构数组与线性表1.1 队列(Queue) 队列是一种运算受限制的线性表,元素的添加在表的一端进行,而元素的删除在表的另一端进行。允许添加元素的一端称为队尾(Rear);允许删除元素的一端称为队头(Front)。向队列添加元素称为入队,从队列中删除元素称为出队。 新入队的元素只能添加在队尾,出队的元素只能是删除队头的元素,队列的特点是先进入队列的元素先出队,所以队列也称作先进先出表或FIFO(First-In-First-Out)表。 数组与线性表队列的表示与堆栈类似,队列也可以简单的用一维数组表示。设数组名为Queue,其下标下界为1,上界为n。一般使用一个变量r指示队
2、尾的下标值,叫做队尾指针;用另一个变量f指示队头的下标值,称为队头指针。队列中元素的数目等于零称为空队列,此时队头指针和队尾指针均为零,即f=r=0。数组与线性表假定有AF 6个元素先后进入队列,但A、B两个元素已陆续出队了,故队尾指针r=6,而队头指针f=3。数组与线性表1. 入队(insert) 当给队列插入元素时,队尾指针r后移而队头指针不动,但有一个情况例外,即当向空队列插入第一个元素时,队头指针与队尾指针同时由0变为1。 设用下标从1到n的数组Q表示队列,且已知待添加的元素在变量x中。 数组与线性表入队函数 void insert (Q, int n, f, r, x) if (r
3、= n) printf(“溢出!n”);/*判断是否已到数组末端*/ else r=r+1; Qr=x;/*插入元素*/ if (f = 0) f=1; /*判断原来是否为空队列*/ 数组与线性表2. 出队(Delete) 当从队列删除元素时,队头指针f后移而队尾指针r不动,但也有一个情况例外,即当删除了最后一个元素,队列成为了空队列时,队头指针与队尾指针同时变为0。假设要求将出队的元素值赋给变量x 。数组与线性表出队函数void Delete (Q, int f, r, n, x) if (f=0) printf(“下溢出!n”); /*判断是否为空队列*/ else x=Qf; /*取队头
4、元素给x赋值*/ if (f=r) f=0; /*若出队的是最后一个元素,变成空队列*/ r=0; else f=f+1; /*队头指针后移*/ 数组与线性表3. 队列存在的问题 由于队列的入队操作是在两端进行的,随着元素的不断插入,删除,两端都向后移动,队列会很快移动到数组末端造成溢出,而前面的单元无法利用。 解决办法:1) 每次删除一个元素后,将整个队列向前移动一个单元,保持队列头总固定在数组的第一个单元 。2) 将所用的数组想象成是头尾相接的圆环,当队列的尾端到达数组的末端(第n个单元)时,如果再插入元素可继续使队列向数组的前端(第1个单元)延长 ,此队列称为循环队列。数组与线性表1.2
5、 循环队列图中阴影部分为队列中元素。如何判断一个循环队列是满还是空? 数组与线性表判断循环队列是否满或空 满:队尾经过一个循环而到达队首的前一个单元时,这种情况下如果再插入新的元素时,新元素就要把原队头的元素覆盖,因此,当r=f时,插入新的元素会造成队列首尾重叠; 空:在队列进行删除运算时,当f=r时表明删除的是队列的最后一个元素,删除这个元素后,队列就变成空队列。 数组与线性表循环队列入队函数void insert(Q, int n, f, r, i) if (r = n) r = 1;/*到达数组末端则向前端延长*/ else r = r+1; if (r = f) printf(“溢出!
6、n”); else Qr=i;/*插入新元素*/ if (f=0) f=1; /*判定是否原来是空队列*/ 数组与线性表循环队列出队函数void Delete(Q, int n, f, r, x) if (f=0) printf (“是空队列!n”); /*是否为空*/ else x=Qf;/*取队头元素赋给变量x*/ if (f=r) f=0; r=0; else if (f=n) f=1; /*由数组末端移到前端*/ else f=f+1; /*队头指针后移*/ 数组与线性表1.3 队列的应用 对于各种具有“先进先出”需排队处理的问题,都可以应用队列来解决。 例如,操作系统在管理和分配系统
7、资源时,大量的应用了队列这种数据结构。1) 队列在输入/输出管理中的应用 2) 对CPU的分配管理 返回数组与线性表例2.1 一个双向栈是将两个栈用一个数组构成,它们的栈底分别设在数组的两端。当一个栈中元素的数目小于n/2时,另一个栈相应的可以大于n/2。试写出以数组高端为底的栈的入栈和出栈的算法。 数组与线性表例2.1解答这个栈的栈顶指针top2是按相反的方向移动的,因此算法有所不同:入栈时为:top2=top2-1出栈时为:top2=top2+1 两个栈在进栈过程中防止溢出的条件是:top2=top1+1 。出栈过程中防止下溢出及判断空栈的条件分别为: top1=0,top2=(n+1)。
8、 数组与线性表入栈算法 void push (ST, int n, top1, top2, G) if (top2=top1+1) printf(“溢出!n”); else top2=top2-1; STtop2=G; /*插入新元素*/ 数组与线性表出栈算法void pop (ST, int n, top1, top2, x) if (top2=n+1) printf(“下溢出!n”); else x=STtop2; top2=top2+1; 数组与线性表例2.2 对于循环队列,试写出求队列长度的算法 。解1:设队列的最大元素个数为n,设一个计数器,将其初始值设为0。从队首开始,沿着队列顺序搜索,每走过一个元素,计数器加1,直到队尾,则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中职第二学年(机械制造技术)组合机床调试试题及答案
- 100%股权项目可行性研究报告
- 管道闭水试验实操规范
- 开放大学电大《建筑施工技术》机考3套真题题库及答案
- 企业流程整体梳理方案
- 电子支付系统安全技术研究
- 教师国家通-用语言模拟题及答案
- 建筑工程-抹灰、饰面施工安全技术交底表格
- 某服装厂加班管理细则
- 夹具设计考试题目及答案
- 2026年湖南科技职业学院单招职业技能考试题库含答案解析
- 施工现场施工设备选型方案
- 安检锂电池培训课件
- 2026国泰海通证券(投行专场)校园招聘考试历年真题汇编附答案解析
- 耳部CT扫描课件
- 《风景园林学名词》
- 山路车辆行车安全培训课件
- 2025《义务教育道德与法治课程标准(2022年版)》测试题库及答案(共4套)
- (2025年标准)sm调教协议书
- 云南水库管理办法
- 生物医学工程概论课件
评论
0/150
提交评论