收藏 分享(赏)

数据结构第三章-2.ppt

上传人:dreamzhangning 文档编号:3326604 上传时间:2018-10-13 格式:PPT 页数:41 大小:594.50KB
下载 相关 举报
数据结构第三章-2.ppt_第1页
第1页 / 共41页
数据结构第三章-2.ppt_第2页
第2页 / 共41页
数据结构第三章-2.ppt_第3页
第3页 / 共41页
数据结构第三章-2.ppt_第4页
第4页 / 共41页
数据结构第三章-2.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、3.6 队列的定义,与线性表相同,仍为一对一关系。,顺序队或链队,以循环顺序队更常见。,只能在队首和队尾运算,且访问结点时依照先进先出(FIFO)的原则。,关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同。,只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。,基本操作:入队或出队,建空队列,判队空或队满等操作。,尾部插入,首部删除,队列定义,例如:队列 Q= (a1 , a2 , a3 , .,an-1 , an ),在队尾插入元素称为入队;在队首删除元素称为出队。,队首,队尾,问:为什么要设计队列?它有什么独特用途?,离散事件的模拟(模拟事件发生的先后顺序,例如 CP

2、U芯片中的指令译码队列); 操作系统中的作业调度(一个CPU执行多个作业); 3. 简化程序设计。,答:,ADT Queue Dset:是一个从两端分别进行插入和删除限定性的线性表。 Rset:队列的一端称为的队头(front),而另一端(rear)称为队尾。 OPSet: CreatQueue ()/构造空队列 IsEmpty()/如果队列为空,则返回true,否则返回false IsFull () /如果队列为满,则返回true,否则返回false GetFront() /返回队头元素 EnQueue(x) /向队列添加元素(进队) DeQueue(x) /从队列取出元素(出队) ,3.7

3、 队列的顺序存储及操作,3.7.1 队列顺序存储 概念:是将队列中的数据元素连续顺序地存放于存储器相邻的单元,来保证队列数据元素逻辑上的有序性。,front指针不动,算法效率低,2。front或rear后移一个位置:一维数组sqM,J1,J2,J3,设两个指针front,rear,约定: rear指示队尾元素; front指示队头元素前一位置 初值front=rear=-1,空队列条件:front=rear,存在问题: 当front=-1,rear=M-1时,再有元素入队发生溢出真溢出 当front-1,rear=M-1时,再有元素入队发生溢出假溢出 解决方案:循环队列 基本思想:把队列设想成

4、环形,让sq0接在sqM-1之后,若rear+1=M,则令rear=0;,实现:利用“模”运算 入队:rear=(rear+1)%M; sqrear=x; 出队: front=(front+1)%M; x=sqfront; 队满、队空判定条件,队空:front=rear 队满:front=rear,解决方案: 1.另外设一个标志以区别队空、队满 2.少用一个元素空间:队空:front=rear队满:(rear+1)%M=front,2。队列顺序存储结构定义,typedef struct EType *element;/一维数组 int front;int rear;int MaxSize; Q

5、ueue; Queue Q,Q1,Q2;,1)构造空队列,viod CreatQueue (Queue ,2)判断队列是否为空,bool IsEmpty(Queue ,3)判断队列是否为满,bool IsFull(Queue ,4)返回队列队头元素的值,Status GetFront(Queue ,5)进队运算,Status Enqueue(Queue ,6)出队运算,Status DeQueue(Queue ,队空条件 : front = rear (初始化时:front = rear ) 队满条件: front = (rear+1) % N (N=maxsize) 队列长度(即数据元素个数

6、):L=(Nrearfront)% N,循环队列总结(人为浪费一个单元): 即front和rear二者之一指向实元素,另一个指向空闲元素。,问3: 在具有n个单元的循环队列中,队满时共有多少个元素?,问1:左图中队列maxsize N=?,问2:左图中队列长度L=?,() rf ()(nfr)% n ()nrf () (nrf)% n,要分析4种公式哪种最合理? 当 r f 时(A)合理; 当 r f 时(C)合理;,答:,综合2种情况,以(D)的表达最为合理,例2:在一个循环队列中,若约定队首指针指向队首元素的前一个位置。那么,从循环队列中删除一个元素时,其操作是 先,移动队首指针,取出元素

7、,,后,。,例1:数组n用来表示一个循环队列,f 为当前队列头元素的前一位置,r 为队尾元素的位置。假定队列中元素的个数小于n,计算队列中元素的公式为:,例3: 一循环队列如下图所示,若先删除4个元素,接着再插入4个元素,请问队头和队尾指针分别指向哪个位置?,解:由图可知,队头和队尾指针的初态分别为front=0和rear=5。,删除4个元素后f=4;,再插入4个元素后,r=(5+4)%6=3,rear=3,3.8 队列的链式存储及操作,typedef struct QueueNode EType data;QueueNode *link; QueueNode;,typedef struct

8、HeadEType Hdata;QueueNode *front;QueueNode *rear; ChainQueue;,1)构造链式队列。,ChainQueue *CreatQueue(ChainQueue *Q) / 构造一个空队列Q=new ChainQueue;Q-front = NULL;Q-rear = NULL;return Q; ,2)判断链式队列是否为空,bool IsEmpty(ChainQueue *Q) / 判断队列Q是否为空if (!Q-front) return true;return false; ,3)返回链式队列队头元素的值,Status GetFront(

9、ChainQueue *Q , EType ,4)链式队列进队运算,Status EnQueue(ChainQueue *Q , EType ,p,p,5)链式队列出队运算,当队列中只有一个元素时:,Q.rear,Status DeQueue (ChainQueue *Q , EType ,程序设计 1。顺序队列构建、进队、出队运算。 2。链式队列构建、进队、出队运算。 要求:从键盘输入数据元素5个student(定义如下), 给出结果。typedef struct int num; /学号 char name10; /姓名 student; typedef student EType;,调度

10、道(中间多条车道),列车重排,进车道:,3,5,1,7,6,出车道:,调度道(中间多条车道),5,1,4,3,2,进车道:,出车道:,对于每个车皮的进入,采用同一运算方法进入备用车道。数据的“队列”结构:从一头进入,从另一头出去。,队列,该缓冲铁轨中现有各车厢的编号均小于current车厢的编号; 如果有多个缓冲铁轨都满足这一条件,则选择一个缓冲铁轨队尾(左端)车厢编号最大的缓冲铁轨;如果已有车厢的缓冲铁轨中,队尾车厢编号都大于current,则current选择一个空的缓冲铁轨(如果存在)进入。如果也无空缓冲铁轨,则无法调度。,开始时创建一个指向k个队列的表头数组Qk,其中,Qi(i=1,2

11、,k)表示第i个缓冲铁轨(队列)。NowOut是下一个要输出至出轨的车厢号。minH是已进入各缓冲铁轨中最小的车厢号;minQ是minH号车厢所在的缓冲铁轨(即队列编号)。,#include #include #include int r10=0,7,4,2,5,8,9,1,6,3; #define MaxQueueSize 9 typedef structQueue; bool IsEmpty(Queue &Q) bool IsFull(Queue &Q) void CreatQueue (Queue &Q) bool Enqueue(Queue &Q , int &x) bool GetF

12、ront(Queue &Q , int &x) bool GetRear(Queue &Q , int &x) bool DeQueue(Queue &Q , int &x),bool RearrangementTrack (int r, int n, int k) Queue *Q = new Queuek+1;/ 创建k个缓冲铁轨队列Hint NowOut = 1; / 当前应该输出的车厢编号 int minH = n+1; / 缓冲铁轨中编号最小的车厢编号,目前假设为n+1(9+1=10) int minQ,i; / minH车厢对应的缓冲铁轨编号for ( i= 0; i5; i+)

13、CreatQueue(Qi);,Queue *Q ; Q=new Queue2; for ( i= 0; i2; i+) CreatQueue(Qi);,typedef struct EType *element;/一维数组 int front; int rear;int MaxSize; Queue;,for ( i = 1; i=n; i+) / 重排车厢if (ri = NowOut) / 当前到站的车厢编号是刚刚出站的车厢编号后一个,直接输出cout “从入轨输出车厢“ ri “ 到出轨“ endl;NowOut+;while (minH = NowOut)Output(minH, m

14、inQ, Q, k, n);NowOut+;else 将ri送入某个缓冲铁轨if (!Hold(ri, minH, minQ, Q, k)return false;return true; void Output(int & minH, int &minQ, Queue Q, int k, int n) bool Hold(int current, int& minH, int &minQ, Queue Q, int k),3.9.2 投资组合问题,对于不能同时选择的投资项目称为冲突项目。核算各种项目组合的资金需求总量,如某种项目组合的资金需求总量超过已拥有的定量资金,则认为该种组合不可行;如

15、存在多个组合方案的资金需求总量都不超过已拥有的资金总量,则企业经营者再从中选择投资回报率最大化的投资组合。,集合A=1,2,3,4,5,6,7,8,9,该冲突关系矩阵将用于划分子集处理算法,判断哪些项目可组合在同一个子集中。,队列的变化过程是,将队列中的所有元素逐个出队一次,每次第一个出队的项目编号作为进入新子集的第一个项目; 以后出队的元素与已进入当前子集的项目进行比较,如不与进入当前子集的任何项目发生冲突,则作为进入当前子集的项目; 凡是属于当前子集的项目不再进队,不属于当前子集的就再次进入队列Q; Q中的元素全部出队一次,就筛选出一个子集,重新入队的元素构成再次筛选的初始队列元素; 由于

16、形成某一子集的元素不再入队,队列元素在不断减少,直至队列中无出队元素,子集划分过程完成。,A1=1,3,4,8 A2=2,7 A3=5 A4=6,9,集合A=1,2,3,4,5,6,7,8,9,画 图,本章小结,线性表、栈、队的异同点: 相同点:逻辑结构相同,都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。, 运算规则不同: 线性表为随机存取; 而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO; 队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。, 用途不同,线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、OS作业调度和简化设计等。,不同点:,第3章结束,/*遍历队列*/ void output() if (IsEmpty(Q) return ;printf(“nn当队列中元素:“);int i=Q.front;while(i!=Q.rear) int x=Q.element(i+1)%(Q.MaxSize+1);printf(“ %d“,x); i+; ,i= (i+1)%(Q.MaxSize+1); x=Q.element (i); printf(“%d “,x);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报