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