数据结构(Java版)队列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
队列
主要内容
1. 2. 3. 4.
5.
队列的定义 队列的操作 队列的实现 实践项目:使用队列实现模拟营业厅程 序。 用java类库实现模拟营业厅程序。
队列的应用




网络打印程序。当网络中的用户发送了打印作业后, 那么这些作业将进入一个打印队列中等候打印,而网 络打印程序每打印一份作业,就从队列中出队一份作 业。 磁盘驱动程序。管理一个磁盘输入/输出请求的队列。 操作系统中的调度程序,维护一个等待处理器时间片 的进程队列。 行业应用程序。比如,医院候诊程序、银行业务等候 程序、移动电话业务等候程序等等。 基数排序程序。使用队列实现的一种排序方法。
问题引入
如何用程序来解决 这个问题呢?


移动电话公司计划在某个区的某条路上新增设一个业 务厅,配置多少个营业员比较合理? 下面是根据市场 调查得到的一组数据,希望以此为依据能测算出比较 合理的营业员配置数目。 平均每天约100个顾客,平均每30秒增加一个顾客。 一个营业员处理一个顾客业务的平均时间是2分钟 (120秒),也就是一个顾客实际办理业务的平均时间。 营业员处理顾客需求原则:只有一个顾客等候队列, 先到先办理。如果某个营业员可以提供服务,则顾客 一到就可以办理业务。
顺序队列存储结构及其基本状态
n-1 n-2 n-1 n-2 n-1 n-2 n-1 n-2
. . .
2 1 =0
顺序队列(a) 空队
. . .
4 3 2 1 队头front= 0
队尾rear=
. . .
队尾rear= 4
. . .
队尾rear= 5
data4 data3 data2 data1
3 2 队头front= 1 0
课堂实训1
修改程序。 为顾客增加一 个编号 显示XX号顾客 到XX号窗口( 营业员)办理 业务。
课堂实训2
链式队列的设计与实现: 将例题3-2中的 顺序队列改为链式队列。
课堂实训3


使用Java类库中的集 合类实现模拟营业厅程 序. 在JAVA类库中,没有 类似于Stack类的专门 用来处理队列的类,但 是我们可以通过 LinkedList类来实现队 列的功能 .
4
4
4
4
5
(b) 队满data1,data2,..,data6入队 front=rear=0
5
(c) data1,data2出队 front=2,rear=0
5
(d) data7入队 front=2,rear=1
链式队列的存储结构及其基本状态
front=rear=null 链式队列(a) 空队
front 链式队列(b)
data4 data3 data2
顺序队列(c) data1出队
4 3 2 队头front= 1 0
data5 data4 data3 data2
顺序队列(d) data5入队
顺序队列(b) data1,data2,data3,data4依此进队
顺序队列的“假溢出” 问题

假设用来存储一个顺序队列的数组的长度n=5, 则当数据data1,data2,data3进队后,将 data1,data2依次出队,然后将data4,data5入队。 此时队尾指针rear=5,如果此时有一个数据元素 data想进入队列,则发生“假溢出”现象。如下 图:
项目实现步骤
程序共包含下面三个类,一个接口,都放在一个 源程序文件 SimulationOffice.java中。




Customer类。定义数据元素,记录顾客到达和离开的 时刻。 QueueADT类。定义数据元素的操作,即进队、出队 等。 ArrayQueue类。用数组实现的队列,ArrayQueue对象 可以模拟顾客队列。 SimulationOffice类。接受输入数据,完成顾客队列的 加载和处理,计算并输出顾客来营业厅办理业务所花 费的平均时间。
data1
data2
data3
data4
null
数据元素data1,data2,data3,data4依此进队
rear
front 链式队列(c)
data2
data3
data4
null
数据元素data1出队 rear
项目实践
调试运行例题3-2
项目设计

首先对数据元素(顾客)和数据操作 (进队和出队等)进行设计,然后设计 一个顾客队列实现所定义的数据操作, 最后在主程序中加载一个顾客队列并对 其进行处理,从而得到所要的结果。
使用java.util.LinkedList实 现队列并使用队列的步骤 为: (1)导入 java.util.LinkedList类 (2)定义数据元素 (3)实现队列 (4)使用队列
小结
自己设计队列并 使用这个队列解 决问题分为下面 四个步骤: (1)定义数据元素 (2)定义数据操作 (3)实现队列 (4)使用队列
1、 队列的定义



和栈相反,队列(Queue)是一种先进先出 (First In First Out,缩写为FIFO)的线性结构。 它只允许在表的一端进行插入,而在另一端删 除元素。 这和我们日常生活中的排队是一致的,最早进 入队列的元素最早离开。 在队列中,允许插入的一端叫做队尾(rear), 允许删除的一端则称为队头(front)。
顺序循环队列的存储结构及其状态
2 3 1 0 5
(a) 空队 front=rear=0
2 3
data3 data4 data5 data6 data2 data1
2 1 0 3
data3 data4 data5 data6
2 1 0 3
data3 data4 data5 data6 data7
1 0
5 4 3 2 1 队头front= 0 5 4 队尾rear= 3 队头front= 2 1 0
队尾rear=5
data3 data2 data1
data3
4 3 队头front= 2 1 0
data5 data4 data3
(a) data1,data2,data3进队
(b) data1,data2出队
2、队列的操作(运算)



进队:在队尾添加一个数据元素。 出队:删除队头的数据元素。 获取队头元素:获取队列中当前队头的数据 元素。 获取当前队列中的元素个数:求当前队列中 的元素个数。 判断队列是否为空:判断当前队列中是否还 有元素。
3、队列的实现
队列可用两种方式来实现 1. 数组实现:队首是索引为0的位置。 2. 链式实现:借助两个引用(指针)front 和rear,front指向链表第一个元素,rear 指向的链表最后一个元百度文库。
类SimulationOffice 需要解决的问题






从键盘输入业员个数、顾客人数、业务处理时间和顾客到达的平均间 隔时间。 根据顾客人数和顾客到达的平均间隔时间值构造一个顾客等候队列, 办事原则是先到先办理。如果某个营业员可以提供服务(空闲),则 顾客一到就可以办理业务。 设置一个数组用来记录营业员当前的空闲时刻。为了简单起见,我们 用整数来表示这个时间,初始的空闲时刻均为0。总是最先空闲的那个 营业员来处理当前顾客队列中的队头顾客,当一个营业员处理完一个 顾客要求后,顾客离去的时刻就是这个营业员的当前空闲时刻。 顾客离去时间的计算。如果顾客到达时间大于当前营业员当前空闲时 刻,则顾客一到就可以办理业务,离去时间=到达时间+业务处理时间; 如果顾客到达时间小于营业员当前空闲时刻,则需要等候,离去时间 =营业员当前空闲时刻+业务处理时刻 累加每个顾客花费的时间。 计算并输出每个顾客平均花费的时间。
(c) data4,data5出队
如何解决顺序队列假溢出?

顺序队列假溢出是因为队头指针front和队尾指针 rear没能及时地随数组上下界值的变化而进行变 化。因此解决的方法是把顺序队列所使用的存储 空间构造成一个逻辑上首尾相接的循环队列,即 最后一个存储单元相邻的下一个存储位置是数组 的第一个存储单元。也就是说,当rear和front 的值达到n-1(数组的长度)时,就使其等于0, 这样就可以避免顺序队列头部空出许多存储单元, 而队尾却因数组下标越界出现假溢出的状况。
具体实现算法
1 2 3 4 定义相关变量 从键盘输入售票员个数,业务处理时间,顾客数目,顾客之间的间隔时间. 定义一个数组用来记录每个营业员的当前时间 定义一个顾客队列cQueue,并初始化队列中每个顾客的到达时间,每隔*秒到达一 个顾客 5 Whilie(cQueue不空){ 出队一个顾客 找出当前时间最小的那个营业员,由该营业员来处理这个 顾客. 当顾客到达时间大于营业员当前时间时,该顾客的离开时间为 顾客到达时间+营业员处理一个顾客的时间 否则,该顾客的离开时间为该营业员的当前时间+营业员处理一个 顾客的时间. 修改该营业员的当前时间 累加顾客花费时间 } 6 计算顾客平均花费时间 7 输出售票员个数和顾客平均花费时间.
相关文档
最新文档