队列的定义表示实现精选PPT.ppt
《队列的定义表示实现精选PPT.ppt》由会员分享,可在线阅读,更多相关《队列的定义表示实现精选PPT.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、队列的定义表示实现第1页,此课件共30页哦3.2 3.2 队列队列只能在表的一端进行插入运算,在表的只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。另一端进行删除运算的线性表。1.1.1.1.定义定义一、概念:一、概念:例如:队列例如:队列 Q=(a1 ,a2 ,a3 ,,an)在队尾插入元素称为在队尾插入元素称为入队入队入队入队;在队首删除元素称为在队首删除元素称为出队出队出队出队。队头元素队头元素队尾元素队尾元素允许插入的一端为队尾,允许删除的一端允许插入的一端为队尾,允许删除的一端为队头。为队头。2第2页,此课件共30页哦与线性表相同,仍为一对一关系。与线性表相同,仍为一对
2、一关系。顺序队顺序队或或链队链队,以,以循环顺序队循环顺序队更常见。更常见。只能在只能在队首队首和和队尾队尾运算,且访问结点时依运算,且访问结点时依照照先进先出(先进先出(FIFOFIFO)的原则。的原则。关键是掌握关键是掌握入队入队和和出队出队操作,具体实现操作,具体实现依顺序队或链队的不同而不同。依顺序队或链队的不同而不同。3.存储结构:存储结构:4.运算规则:运算规则:5.实现方式实现方式:2.2.逻辑结构:逻辑结构:3第3页,此课件共30页哦二、队列的抽象数据类型定义二、队列的抽象数据类型定义ADT Queue 数据对象数据对象:D ai|ai ElemSet,i=1,2,.,n,n0
3、 数据关系数据关系:R1|ai-1,aiD,i=2,.,n 约定a1 端为队列头,an 端为队列尾。基本操作:基本操作:ADT Stack4第4页,此课件共30页哦(1 1)初始化队列)初始化队列 InitQueue(&Q)InitQueue(&Q)(2 2)入队)入队 EnQueue(&Q,e)EnQueue(&Q,e)(3 3)出队)出队 DeQueue(&Q,&e)DeQueue(&Q,&e)(4 4)获取队头元素内容)获取队头元素内容 GetHead(Q,&e)GetHead(Q,&e)(5 5)判断队列是否为空)判断队列是否为空 QueueEmpty(Q)QueueEmpty(Q)基
4、本操作基本操作:建队列、判断队列是否为空、入队、出队、建队列、判断队列是否为空、入队、出队、读队头元素值,等等。读队头元素值,等等。5第5页,此课件共30页哦链链队列队列类型定义:类型定义:typedef struct QueuePtr front;/队头指针 QueuePtr rear;/队尾指针 LinkQueue;结点结点类型定义:类型定义:typedef struct QNode QElemType data;/元素 struct QNode *next;/指向下一结点的指针 Qnode,*QueuePtr;关于整个链队的总关于整个链队的总体描述体描述链队中任一结链队中任一结点的结构点
5、的结构三、队列的表示和实现三、队列的表示和实现1.1.单链队列单链队列/-队列的链式存储结构队列的链式存储结构-6第6页,此课件共30页哦a1anQ.frontQ.rearQ.frontQ.rear空队列空队列为了操作方便,添加一个头结点,令头指针指向头结点。为了操作方便,添加一个头结点,令头指针指向头结点。Q.front=Q.rear7第7页,此课件共30页哦 Status InitQueue(LinkQueue&Q)/构造一个空队列 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode);if(!Q.front)exit(OVERFLOW);/存储分配失
6、败 Q.front-next=NULL;return OK;/-基本操作的算法描述基本操作的算法描述-建队操作建队操作构造空队列构造空队列构造空队列构造空队列Q Q Q Q8第8页,此课件共30页哦Q(队尾队尾)(队首队首)fronta1a2a3rearp链队会满吗?链队会满吗?一般不会,因为删除时有一般不会,因为删除时有freefree动作。除非动作。除非内存不足!内存不足!入队(尾部插入):入队(尾部插入):rear-next=S;rear=S;出队(头部删除):出队(头部删除):p=front-next;front-next=p-next;free(p);Se链队列的入队和出队操作链队列
7、的入队和出队操作9第9页,此课件共30页哦 Status EnQueue(LinkQueue&Q,QElemType e)/插入元素e为Q的新的队尾元素 p=(QueuePtr)malloc(sizeof(QNode);if(!p)exit(OVERFLOW);/存储分配失败 p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;return OK;10第10页,此课件共30页哦 Status DeQueue(LinkQueue&Q,QElemType&e)/若队列不空,则删除Q的队头元素,/用 e 返回其值,并返回OK;否则返回ERROR if(Q.fron
8、t=Q.rear)return ERROR;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear=p)Q.rear=Q.front;/一定要考虑 free(p);return OK;11第11页,此课件共30页哦队列的顺序存储结构如下图所示:队列的顺序存储结构如下图所示:附设两个指针附设两个指针front和和rear分别指示队列头元素的位置和队分别指示队列头元素的位置和队列尾元素的下一个位置列尾元素的下一个位置约定:约定:初始化建空队列时,令初始化建空队列时,令front=rear=0front=rear=0;2.2.顺序队列顺序队列12第
9、12页,此课件共30页哦(2 2)空队列的特征?空队列的特征?约定:约定:front=rearfront=rear问题:(问题:(1 1)怎样实现入队和出队操作?)怎样实现入队和出队操作?核心语句如下:核心语句如下:入队入队(尾部插入尾部插入):Qrear=e;rear+;Qrear=e;rear+;出队出队(头部删除头部删除):e=Qfront;front+;e=Qfront;front+;(3 3)队列会满吗?)队列会满吗?极易装满!极易装满!因为数组通常有长度限制,而其前因为数组通常有长度限制,而其前端空间无法释放。有假溢出现象。端空间无法释放。有假溢出现象。如图:如图:13第13页,此
10、课件共30页哦解决假溢出的途径解决假溢出的途径采用循环队列采用循环队列在顺序队中,当尾指针已经到了数组的上界,不在顺序队中,当尾指针已经到了数组的上界,不能再有入队操作,但实际上数组中还有空位置,能再有入队操作,但实际上数组中还有空位置,这就叫这就叫“假溢出假溢出”。讨论:什么叫讨论:什么叫“假溢出假溢出”?如何解决?如何解决?将存储队列元素的一维数组首尾相接,形将存储队列元素的一维数组首尾相接,形成一个环状。成一个环状。14第14页,此课件共30页哦a3a2a10123N-1rearfront循环队列(臆造)循环队列(臆造)顺序队列顺序队列a3a2a1frontrear 0 1 2 3 .N
11、-115第15页,此课件共30页哦新问题:新问题:在循环队列中,队空时在循环队列中,队空时 front=rear;队满时也会;队满时也会有有 front=rear;判决条件将出现;判决条件将出现二义性二义性!解决方案有二:解决方案有二:使用一个计数器记录队列中元素个数(即队列长度);使用一个计数器记录队列中元素个数(即队列长度);人为浪费一个单元,约定:队列头指针在队列尾指针的人为浪费一个单元,约定:队列头指针在队列尾指针的 下一位下一位置上作为队列呈置上作为队列呈“满满”状态的标志。则队满特征可改为状态的标志。则队满特征可改为front=(rear+1)%N front=(rear+1)%N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 定义 表示 实现 精选 PPT
限制150内