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