




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
栈栈的应用队列队列的应用,第三章栈和队列,3.4队列3.4.1抽象数据类型队列的定义队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。,例如:排队购物。操作系统中的作业排队。先进入队列的成员总是先离开队列。因此队列亦称作先进先出(FirstInFirstOut)的线性表,简称FIFO表。,a0a1a2an-1,rear,队头,队尾,front,队列的示意图,队列的特点先进先出,说明:第一个入队的元素在队头,最后一个入队的元素在队尾,第一个出队的元素为队头元素,最后一个出队的元素为队尾元素,队列的抽象数据定义见书59,队列的基本运算队列可定义如下五种基本运算:,1初始化队列InitQueue(intfront;/*队头位置*/intrear;/*队尾位置*/SqQueue;,顺序队列的操作演示,队列的顺序存储结构定义:,SqQueueQQ-front存放即将要被删除的元素的下标。Q-rear存放即将要被插入的元素(目前不在队列中)的下标。Q-dataQ-front和Q-dataQ-rear,初始化:Q.front=Q.rear=0队空:Q.front=Q.rear队满:Q.rear=maxsize(假溢出)求队长:Q.rear-Q.front入队:新元素按rear指示位置加入,再将队尾指针加一,即rear=rear+1出队:将front指示的元素取出,再将队头指针加一,即front=front+1,非循环队列,注意:入队应考虑队满;出队应考虑队空。,和栈类似,队列中亦有上溢和下溢现象。此外,顺序队列中还存在“假上溢”现象。因为在入队和出队的操作中,头尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。因此,尽管队列中实际的元素个数远远小于向量空间的规模,但也可能由于尾指针巳超出向量空间的上界而不能做入队操作。该现象称为假上溢。,为充分利用向量空间,克服上述假上溢现象,可以将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量,存储在其中的队列称为循环队列(CircularQueue)。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(QueueSize-1)时,其加1操作的结果是指向向量的下界0。,显然,因为循环队列元素的空间可以被利用,除非向量空间真的被队列元素全部占用,否则不会上溢。因此,除一些简单的应用外,真正实用的顺序队列是循环队列(环形队列)。,入队和出队如何表示?,由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,我们无法通过Q-f=Q-r来判断队列“空”还是“满”。,front,J5,J6,J7,0,1,2,3,4,5,rear,front,J4,J9,J8,J4,J5,J6,0,1,2,3,4,5,rear,front,初始状态,队空:front=rear队满:front=rear,解决方案:1.另外设一个标志以区别队空、队满2.少用一个元素空间:队空:Q-front=Q-rear队满:(Q-rear+1)%M=Q-front,队空:Q.front=Q.rear队满:Q.front=(Q.rear+1)%maxSize入队:Q.rear=(Q.rear+1)%maxSize出队:Q.front=(front+1)%maxSize;求队长:(Q.rear-Q.front+maxSize)%maxSize,循环队列,【例】设循环队列的容量为40(序号从0到39),现经过一系列的入队和出队运算后,有front=11,rear=19;front=19,rear=11;问在这两种情况下,循环队列中各有元素多少个?,答:用队列长度计算公式:(Q.rear-Q.front+maxSize)%maxSizeL=(401911)%40=8L=(401119)%40=32,循环队列的操作演示,循环队列的基本运算实现1、进队列1)进队列算法,2)进队列实现程序StatusEnQueue(SqQueue,(1)检查队列是否已满,若队满,则进行溢出错误处理;(2)将新元素赋给队尾指针所指单元;(3)将队尾指针后移一个位置(即加1),指向下一单元。,2)出队列实现程序StatusDeQueue(SqQueue,2.出队列,1)出队列算法,(1)检查队列是否为空,若队空,则进行下溢错误处理;(2)取队首元素的值。(3)将队首指针后移一个位置(即加1);,(4)取队头元素ElemTypeGetHead(SqQueueQ)if(Q.front=Q.rear)return(ERROR);return(Q.dataQ.front);,(3)队列初始化Q.front=Q.rear=0;,(5)判队列空否intQueueEmpty(SqQueueQ)if(Q.front=Q.rear)reurn(1);elsereturn(0);,3.4.3链队列队列的链式存储结构简称为链队列,它是限制仅在表头删除和表尾插入的单链表。显然仅有单链表的头指针不便于在表尾做插入操作,为此再增加一个尾指针,指向链表的最后一个结点。于是,一个链队列由头指针和尾指针唯一确定。,null,*q,q.front,q.rear,非空队列,q.front,q.rear,null,空队列,*q,链队列示意图,和顺序队列类似,我们也是将这两个指针封装在一起,将链队列的类型LinkQueue定义为一个结构类型:typedefstructqueuenodeElemTypedata;structqueuenode*next;QueueNode;typedefstructQueueNode*front;QueueNode*rear;LinkQueue;,LinkQueueQ;Q-front队列的头指针Q-rear队列的尾指针,运算的实现,voidInitQueue(LinkQueue,1、创建一个空队列:,2、队列的判空:intQueueEmpty(LinkQueueQ)return(Q.front-next=NULL,voidEnQueue(LinkQueue,3、入队操作,null,*q,q.front,q.rear,x,null,p,4、出队操作:,StatusDeQueue(LinkQueue,null,*q,q.rear,x,null,q.front,p,存储池,if(Q.rear=p)Q.rear=Q.front;free(p);returnOK;,队列的应用,队列在日常生活中和计算机程序设计中,有着非常重要的作用,在此,仅举出两个方面例子来说明它,其它应用在后面章节中将会遇到。,第一个例子就是CPU资源的竞争问题。在具有多个终端的计算机系统中,有多个用户需要使用CPU各自运行自己的程序,它们分别通过各自终端向操作系统提出使用CPU的请求,操作系统按照每个请求在时间上的先后顺序,将其排成一个队列,每次把CPU分配给队头用户使用,当相应的程序运行结束,则令其出队,再把CPU分配给新的队头用户,直到所有用户任务处理完毕。,第二个例子就是主机与外部设备之间速度不匹配的问题。以主机和打印机为例来说明,主机输出数据给打印机打印,主机输出数据的速度比打印机打印的速度要快得多,若直接把输出的数据送给打印机打印,由于速度不匹配,显然是不行的。所以解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依此写如到这个缓冲区中,写满后就暂停输出,继而去做其它的事情,打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求,主机接到请求后再向缓冲区写入打印数据,这样利用队列既保证了打印数据的正确,又使主机提高了效率。,讨论(本章小结),线性表、栈与队的异同点相同点:逻辑结构相同,都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。不同点:运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。用途不同,线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、多道作业处理和简化设计等。,1、称正读和反读都相同的字符序列为“回文”,例如“abba”,写一个算法,判别读入以“”为结束符的字符序列是否为“回文”。2、假设以带头结点的循环链表表是队列,并且只设一个指针指向队尾结点,但不设头指针,设计相应的入队和出队算法。,intTest()/判别输入的字符串是否回文序列,是返回1,否返回0StackS;QueueQ;char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 来源合法轿车买卖合同4篇
- 产品试用协议书范本与产品试经销合同2篇
- 发明创造专利委托办理合同6篇
- 厨师和酒店承包合同9篇
- 行业合同有哪些
- 《施工组织设计专项施工方案资料》中科院青年小区10号、11号楼回填土施工组织设计方案
- 结构化面试题库及答案禁止烧冥纸
- 工厂二级安全培训内容课件
- 2025年教育大数据在教师绩效评价中的应用与挑战分析
- 个人资产规整管理办法
- 口腔护理论文-口腔论文-临床医学论文-医学论文
- 部队油库承包合同协议
- 江苏语文单招试题及答案
- 2024第41届全国中学生物理竞赛预赛试题(含答案)
- 诊所护士劳动合同协议
- 重庆市两江育才中学校2023-2024学年高一上学期期中考试英语 含解析
- TCAICI39-2022《通信光缆附挂供电杆路技术规范》
- 碳市场发展对天然气行业影响的研究报告
- 2025年国家保安员资格考试模拟100题及答案
- 防火公路施工方案
- 商学院课程总结与展望
评论
0/150
提交评论