栈和队列链队列.ppt_第1页
栈和队列链队列.ppt_第2页
栈和队列链队列.ppt_第3页
栈和队列链队列.ppt_第4页
栈和队列链队列.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 栈和队列,教学目标 3.1 栈 3.1.1 栈的定义 3.1.2 栈的顺序存储结构及其基本实现 3.1.3 栈的链式存储结构及其基本实现 3.2 队列 3.2.1 队列的定义 3.2.2 队列的顺序存储结构及其基本实现 3.2.3 队列的链式存储结构及其基本实现 本章小结,3.2 队列 3.2.1 队列的定义 3.2.2 队列的顺序存储结构及其基本实现,温故知新环节,特殊线性表队列,队列的逻辑结构 队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表。,a1,a2,a3,入队,出队,队列的操作特性:,先进先出,循环队列:将存储队列的数组头尾相接。,如何解决假溢出?,0 1 2 3 4,入队,出队,a3,a4,a5,a6,队列的顺序存储结构及实现(顺序队列),不存在物理的循环结构,但可用软件方法实现。 求模:(41)mod 50,MaxSize=6 char dataMaxSize; rear=5 rear=? datarear=F;,rear=(rear+1)%MaxSize,3.2.2 队列的顺序存储结构及其实现- 问题一,循环队列首尾相连, 这可以利用除法取余的运算()来实现: 队首指针进1:front=(front+1)MaxSize 队尾指针进1:rear=(rear+1)MaxSize,队空和队满的条件都是 front=rear,如何区分?,front=rear,front=rear,3.2.2 队列的顺序存储结构及其实现- 问题二,怎样区分队空与队满之间的差别呢?在入队时少用一个数据元素空间,以队尾指针加1等于队首指针判断队满,即队满条件为: (q-rear+1) % MaxSize=q-front 队空条件仍为: q-rear=q-front,温故知新环节,栈和队列都是()(南京理工) 顺序存取的线性结构 链式存储的非线性结构 限制存取点的线性结构 限制存取点的非线性结构,温故知新环节,若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入2个元素后,rear和front的值分别为多少? (浙大) a)1和5 b)2和4 c)4和2 d)5和1,温故知新环节,设栈S和队列Q的初始状态为空, 元素e1,e2,e3,e4,e5,e6依次通过栈S, 一个元素出栈后即进入队列Q, 若6个元素出队的序列是 e2,e4,e3,e6,e5,e1,则栈的 容量至少应该是() (南京理工) 6 b)4 c)3 d)2,温故知新环节,循环队列存储在数组A0m中,则入队时的操作为() A.rear=rear+1 B.rear=(rear+1)mod(m-1) C.rear=(rear+1)mod m D.rear=(rear+1)mod(m+1),温故知新环节,3.2 队列 3.2.3 队列的链式存储结构及其基本实现 循环队列:必须预先确定一个固定的长 度,所以有存储元素个数的限制和空间 浪费的问题。还有队满的情况发生。,新语新知环节,链队列:队列的链接存储结构,队头指针即为链表的头指针,如何改造单链表实现队列的链接存储?,队列的链式存储结构及实现(链队列),非空链队列,q,rear,空链队列,front,rear,队列的链式存储结构及实现(链队列),q,链列的入队和出队操作示意图,front,rear,q,(a),链队初态,front,rear,(c),出队,1,个元素,b,c,3.2.3 队列的链式存储结构及其基本运算的实现,q,(1) 存储队列元素的结点数据类型,单链表中数据结点类型QNode定义如下: typedef struct qnode ElemType data; /*数据元素*/ struct qnode *next; QNode;,3.2.3 队列的链式存储结构及其基本运算的实现,(2) 指向队头和队尾指针的链队头结点,链队中头结点类型LiQueue定义如下: typedef struct QNode *front; /*指向单链表队头结点*/ QNode *rear; /*指向单链表队尾结点*/ LiQueue;,3.2.3 队列的链式存储结构及其基本运算的实现,(1) 存储队列元素的单链表,(2) 指向队头和队尾指针的链队头结点,单链表中数据结点类型QNode定义如下: typedef struct qnode ElemType data; /*数据元素*/ struct qnode *next; QNode;,链队中头结点类型LiQueue定义如下: typedef struct QNode *front; /*指向单链表队头结点*/ QNode *rear; /*指向单链表队尾结点*/ LiQueue;,front,rear,q,(b),入队,3,个元素,a,b,c,front,rear,q-front=s,q- rear=s,S-next=NULL,S-next=NULL,q-rear-next=s,q-rear=s,q,3.2.3 队列的链式存储结构及其基本运算的实现-入队,front,rear,c,队中有多个结点的时候,Free(p),P= q-front,front,rear,b,队中有一个结点的时候,P= q-front,q-front=q-rear=NULL,Free(p),3.2.3 队列的链式存储结构及其基本运算的实现-出队,q,q,q-front=p-next,(1) 初始化队列InitQueue(q) (2) 判断队列是否为空QueueEmpty(q) (3) 入队列enQueue(q,e) (4) 出队列deQueue(q,&e) (5) 销毁队列ClearQueue(q),3.2.3 队列的链式存储结构及其基本运算的实现,(1) 初始化队列InitQueue(q) 构造一个空队列,即只创建一个链队头结点,其front和rear域均置为NULL,不创建数据元素结点。对应算法如下: LiQueue * InitQueue(void) LiQueue *q; q=(LiQueue *)malloc(sizeof(LiQueue); q-front=q-rear=NULL; return q; ,3.2.3 队列的链式存储结构及其基本运算的实现-初始化,(2) 判断队列是否为空QueueEmpty(q) 若链队结点的rear域值为NULL,表示队列为空,返回1;否则返回0。对应算法如下: int QueueEmpty(LiQueue *q) if (q-rear=NULL) return 1; else return 0; ,3.2.3 队列的链式存储结构及其基本运算的实现-判空,(3) 入队列enQueue(q,e) 创建data域为e的数据结点*s。若原队列为空,则将链队结点的两个域均指向*s结点,否则,将*s链到单链表的末尾,并让链队结点的rear域指向它。对应算法如下:,3.2.3 队列的链式存储结构及其基本运算的实现-入队,void enQueue(LiQueue *q,ElemType e) QNode *s; s=(QNode *)malloc(sizeof(QNode); s-data=e; if (q-rear=NULL) /*若原链队为空,新结点是队首结点又是队尾结点*/ q-front=q-rear=s; s-next=NULL; else q-rear-next=s; /*将*s结点链到队尾,rear指向它*/ q-rear=s; s-next=NULL; ,front,rear,q,a,b,c,(4) 出队列deQueue(q,e) 若原队列不为空,则将第一个数据结点的data域值赋给e,并删除之。若出队之前队列中只有一个结点,则需将链队结点的两个域均置为NULL,表示队列已为空。对应的算法如下: 队空 队中只有一个结点 队中多个结点,3.2.3 队列的链式存储结构及其基本运算的实现-出队,int deQueue(LiQueue *q,ElemType *e) QNode *p; if (q-rear=NULL) return 0; /队空 p=q-front; /让P指向要删除的结点 if (q-front=q-rear) /原链队中只有一个结点时 q-front=q-rear=NULL; else /原链队中有多个结点时 q-front=p-next; *e=p-data; free(p); return 1; ,(5) 销毁队列ClearQueue(q) 释放队列占用的存储空间,包括链队头结点和所有数据结点的存储空间。对应算法如下: void ClearQueue(LiQueue *q) QNode *p=q-front,*r; while(p!=NULL) /*释放数据结点占用空间*/ r=p-next; free(p); p=r; free(q); /*释放链队结点占用空间*/ ,(1)设有N个人站成一排,从左到右的编号分别是1到N,现在从左到右报数“1,2,1,2,1,2”数到1的人出列,数到2的人立即站到队伍的右边.报数过程反复进行,直到N个人都出列为止。要求给出他们的出列顺序。 (2)数据组织 先进先出,这是个用队列解决出列的问题,采用环形顺序队列 (3)设计运算算法 将N个人编号入队,然后反复执行如下操作,直到队列为空: 出队一个元素,输出其编号 若队列不空,则再出队一个元素,并将刚出列的元素进队站到队尾,3.2.4 队列的实例,printf(“n依次进队元素1-%d:t“,n); for(i=1;i“,e); if(QueueEmpty(q)=1) printf(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论