数据结构3_队列
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2)队列的抽象数据类型
基本操作: 共七条) (2)基本操作: (共七条) 7、DeQueue(&Q, &e) 初始条件: 为非空队列。 初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e返回其值。 操作结果:删除Q的队头元素,并用e返回其值。
(3)队列的表示和实现
链队列——队列的链式表示和实现 1)链队列 队列的链式表示和实现
(1)链队列——队列的链式表示和实现 链队列——队列的链式表示和实现 4)出队列
Status DeQueue(linkqueue &Q,Qelemtype &e){ //若队列非空,删除Q的队头元素,用e返回其值,并返回OK //否则返回ERR If (q.front = = q.rear) return err; p = q.front -> next; p ->next = NULL; e = p ->data; q.front -> next = p ->next; if (q.rear = = p) q.rear = q.front; free(p); Return OK; } // DeQueue;
2)队列的抽象数据类型
基本操作: 共七条) (2)基本操作: (共七条) 1、InitQueue(&Q) 操作结果:构造一个空队列Q 操作结果:构造一个空队列Q。 2、DestroyQueue(&Q) 初始条件:队列Q已存在。 初始条件:队列Q已存在。 操作结果:队列Q被销毁,不再存在。 操作结果:队列Q被销毁,不再存在。 3、ClearQueue(&Q) 初始条件:队列Q已存在。 初始条件:队列Q已存在。 操作结果: 操作结果:将Q清为空队列。 清为空队列。
链队列——链式映象 链队列 typedef struct QNode { QElemType data; struct QNode *next; } QNode, *QueuePtr; typedef struct { QueuePtr front; // 队头指针 QueuePtr rear; // 队尾指针 } LinkQueue;
(1)链队列——队的链式表示和实现 链队列——队列的链式表示和实现 2)销毁队列 Q
Status DestoryQueue(linkqueue &Q){ //销毁队列Q while (q.front) { q.rear = q.front -> next; free(q.front); q.front = q.rear; } Return OK; } // DestoryQueue;
2)队列的抽象数据类型
类型定义: (1)类型定义: ADT Queue { 数据对象: 数据对象:D={ai | ai∈ElemSet, i=1,2,...,n, n≥0} 数据关系:R1= 数据关系:R1={ <a i-1,ai > | ai-1, ai ∈D, i=2,...,n} 约定其中a 端为队列头, 端为队列尾。 约定其中a1 端为队列头,an 端为队列尾。
(3)队列的表示和实现
循环队列——队列的顺序映象 2)循环队列 队列的顺序映象
引入原因: 引入原因:
(3)队列的表示和实现
循环队列——队列的顺序映象 2)循环队列 队列的顺序映象
#define MAXQSIZE 100 //最大队列长度 typedef struct { QElemType *base; // 动态分配存储空 间 int front; // 头指针,若队列不空, 指向队列头元素 int rear; // 尾指针,若队列不空,指 向队列尾元素的下一个位置 } SqQueue; 注意,如果队列的容量无法预 先估计时,可以采用链 表存储结构
3.4 队列
出队列
a1 a2 a3 ┄┄ an
头 尾
入队列
1)队列的定义 队列(Queue)简称队,是限定所有的插入只能在表的一端进行, 队列(Queue) 而所有的删除都在表的另一端进行的线性表。 表中允许插入的一端称为队尾 队尾(Rear), 队尾 允许删除的一端称为队头 队头(Front) 队头 向队列中插入新元素称为进队 入队 进队或入队 进队 入队,新元素进队后就成为 新的队尾元素; 从队列中删除元素称为离队 出队 离队或出队 离队 出队,元素离队后,其后继元 素就成为新的队首元素。 由于队列的插入和删除操作分别是在各自的一端进行的,每 个元素必然按照进入的次序离队,所以又把队列称为先进先 先进先 出表(First Input Last Output,简称FIFO FIFO)。 出表 FIFO 2)队列的抽象数据类型
判别循环队列空间“满”和“空”的条件 两种方法:1、设标志判别;2、少用一个元素空间,约定以 “头指针在尾指针的下一个位置上”作为“满”的 标志
上图,循环队列的头尾指针。 (a)一般情况 (b)队列满时
(c)队列空时
(1)链队列——队列的链式表示和实现 链队列——队列的链式表示和实现 3)入队列
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; } // EnQueue;
2)队列的抽象数据类型
共七条) (2)基本操作: (共七条) 基本操作: 4、 QueueLength(Q) 初始条件:队列Q已存在。 初始条件:队列Q已存在。 操作结果:返回Q的元素个数,即队列的长度。 操作结果:返回Q的元素个数,即队列的长度。 5、 GetHead(Q, &e) 初始条件: 为非空队列。 初始条件:Q为非空队列。 操作结果: 操作结果:用e返回Q的队头元素。 返回Q的队头元素。 6、 EnQueue(&Q, e) 初始条件:队列Q已存在。 初始条件:队列Q已存在。 操作结果:插入元素e为Q的新的队尾元素。 操作结果:插入元素e 的新的队尾元素。
PAGE61图3。10
栈顶指针和栈中元素之间的关系图见后
(1)链队列——队列的链式表示和实现 链队列——队列的链式表示和实现 1)构造一个空队列
Status InitQueue(linkqueue &Q){ //构造一个空队列Q q.front = q.rear = (queueptr)malloc(sizeof(QNode)); If (!q.front) exit (OVERFLOW);//存储分配失败 q.front ->next = NULL; Return OK; } //initQueue;