数据结构第四章队列教案

合集下载

队列数据结构课程设计

队列数据结构课程设计

队列数据结构课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。

知识目标要求学生掌握队列的基本概念、特点和应用;技能目标要求学生能够运用队列解决实际问题,并理解队列的运算;情感态度价值观目标要求学生培养良好的学习习惯和团队合作精神。

通过本课程的学习,学生将能够了解并掌握队列的基本概念和特点,包括先进先出(FIFO)的性质。

他们将能够应用队列解决实际问题,如数据同步、任务调度等。

此外,学生将培养良好的学习习惯,学会团队合作,提高解决问题的能力。

二、教学内容本课程的教学内容将根据课程目标进行选择和,确保内容的科学性和系统性。

教学大纲将明确教学内容的安排和进度,指出教材的章节和列举内容。

教材的章节将包括队列的基本概念、特点和应用。

具体内容将涵盖队列的定义、队列的运算(入队、出队)、队列的应用场景等。

此外,还将通过实例和案例分析,让学生更好地理解和应用队列。

三、教学方法为了激发学生的学习兴趣和主动性,将采用多种教学方法。

讲授法将用于解释和阐述队列的基本概念和特点。

讨论法将鼓励学生积极参与,提出问题和观点,促进课堂互动。

案例分析法将通过实际案例的分析和解决,让学生更好地理解队列的应用。

实验法将提供实践机会,让学生通过编写代码和运行实验,深入理解队列的运算和应用。

四、教学资源为了支持教学内容和教学方法的实施,将选择和准备适当的教学资源。

教材将提供基础知识,参考书将提供更深入的内容和实例。

多媒体资料将通过图像、视频等形式,丰富学生的学习体验。

实验设备将提供实践机会,让学生亲自操作和观察队列的运算。

以上是本章节的课程设计,通过明确的教学目标、科学的教学内容、多样化的教学方法和适当的教学资源,旨在帮助学生全面掌握队列的知识和技能。

五、教学评估为了全面反映学生的学习成果,本课程将采用多种评估方式。

平时表现将占总分的30%,包括课堂参与度、提问和回答问题的情况等。

作业将占总分的20%,包括练习题、小项目和报告等。

《刘大有数据结构》 chapter 4 线性表、堆栈和队列

《刘大有数据结构》 chapter 4 线性表、堆栈和队列

4. 遍历链表 所谓遍历一个结构, 遍历一个结构 所谓遍历一个结构,是指按一定的次序访问结构中的所有 结点,且每个结点恰被访问一次。遍历链表, 结点,且每个结点恰被访问一次。遍历链表,就是按一定 次序访问链表的所有结点。 次序访问链表的所有结点。 算法PrintList(head) 算法 ( ) PL 1 [取表头,计数器初始化 取表头, 取表头 计数器初始化] currptr ← head . count ← 0 . PL 2 [遍历并输出链表结点的 遍历并输出链表结点的data值] 值 遍历并输出链表结点的 WHILE(currptr ≠ NULL) DO ( ) ( PRINT( data(currptr) ). count ← count + 1. ( ( ) IF(MOD(count,5)= 0 ) THEN PRINT . ( ( , ) currptr ← next(currptr). ( ) )▌
header
next
data next
data next

data next
图 4.5 循环链表
由于单链表和循环链表中对头结点的定义是不同的, 由于单链表和循环链表中对头结点的定义是不同的,因而 对于单链表和循环链表而言, 对于单链表和循环链表而言,检测链表是否为空的方法并 不相同: 不相同: 单链表: 单链表: 循环链表: 循环链表: head = = NULL header > next = = header
线性表、 第四章 线性表、堆栈和队列
4.1 线性表的定义和基本操作 4.2 线性表的存储结构 4.3 堆栈和队列
4.1 线性表的定义和基本操作
定义4.1 一个线性表是由零个或多个具有相同类型 一个线性表 线性表是由零个或多个具有相同类型 定义 的结点组成的有序集合。 我们用( 的结点组成的有序集合 。 我们用 ( a0 , a1 , …, , an-1 ) 来表示一个线性表 , n为一个自然数 。 当 来表示一个线性表, 为一个自然数 为一个自然数。 n>0时 n>0 时 , a0 称为表的 始结点 , an-1 称为表的 终结点 , 称为表的始结点 始结点, 称为表的终结点 终结点, ai称为ai+1的前趋结点,ai+1称为ai的后继结点;当 称为 前趋结点, 称为 后继结点; n=0时 , 表中有零个结点 , 包含零个结点的线性 时 表中有零个结点, 表被称为空表 空表。 表被称为空表。

队列及其表示方法教案

队列及其表示方法教案

队列及其表示方法教案一、概述队列是一种常见的数据结构,它具有先进先出(FIFO)的特性。

本教案旨在介绍队列的基本概念和表示方法,帮助学生理解和应用队列。

二、队列的定义队列是一种有序的线性表,只允许在表的一端(队尾)进行插入操作,在另一端(队头)进行删除操作。

插入操作又称为入队(enqueue),删除操作又称为出队(dequeue)。

三、队列的基本操作1. 入队操作入队操作将元素添加到队列的队尾。

具体步骤如下:1. 判断队列是否已满,若已满则报错(队列溢出)。

2. 将待插入元素添加到队列的队尾。

3. 修改队尾指针。

2. 出队操作出队操作将队头元素从队列中删除并返回。

具体步骤如下:1. 判断队列是否为空,若为空则报错(队列为空)。

2. 返回队头元素。

3. 修改队头指针。

四、队列的表示方法队列有多种表示方法,常见的有顺序存储表示和链式存储表示。

1. 顺序存储表示顺序存储表示使用数组来存储队列元素。

采用两个指针front 和rear分别指向队头和队尾元素。

当队列为空时,front和rear指向同一个位置。

2. 链式存储表示链式存储表示使用链表来存储队列元素。

每个节点包含一个元素值和指向下一个节点的指针。

头指针指向队头节点,尾指针指向队尾节点。

五、总结队列是一种常用的数据结构,具有先进先出的特性。

本教案介绍了队列的定义、基本操作和表示方法,希望能够帮助学生掌握队列的基本概念和应用。

注意:本文档中的内容仅供参考,具体操作请根据实际情况进行调整和实施。

数据结构课件队列备课讲稿

数据结构课件队列备课讲稿

链队列示意图
*q q.front
null
q.rear
非空队列
*q
q.front
null
q.rear
空队列
和顺序队列类似,我们也是将这两个指针封 装在一起,将链队列的类型LinkQueue定义为 一个结构类型:
typedef struct queuenode{
ElemType data;
struct queuenode *next;
第二个例子就是主机与外部设备之间速度不匹配的问 题。以主机和打印机为例来说明,主机输出数据给打 印机打印,主机输出数据的速度比打印机打印的速度 要快得多,若直接把输出的数据送给打印机打印,由 于速度不匹配,显然是不行的。所以解决的方法是设 置一个打印数据缓冲区,主机把要打印输出的数据依 此写如到这个缓冲区中,写满后就暂停输出,继而去 做其它的事情,打印机就从缓冲区中按照先进先出的 原则依次取出数据并打印,打印完后再向主机发出请 求,主机接到请求后再向缓冲区写入打印数据,这样 利用队列既保证了打印数据的正确,又使主机提高了 效率。
Q.rear=p; }
4、出队操作:
*q q.front q.rear
p null x null
存储池
Status DeQueue(LinkQueue &Q,ElenType &e)
{
QueueNode *p; if(QueueEmpty(Q))
return ERROR; p=Q.front->next; e=p–>data;
队列的抽象数据定义见书P59
3.4.2 非循环队列和循环队列
分配一块连续的存储区域来存放队列里的元素。由 于队列的队头和队尾的位置是变化的,因而要设两个 指针和分别指示队头和队尾元素在队列中的位置。

队列教学法示范教案

队列教学法示范教案

队列教学法示范教案第一节:引入教学目标•了解队列数据结构的基本概念与特点•学会队列的基本操作方法•能够运用队列解决简单的问题•培养学生合作与沟通能力教学内容•什么是队列•队列的特点•队列的基本操作方法•队列的应用举例教学准备•教师:投影仪、教案、白板、白板笔•学生:纸、笔第二节:概念讲解1. 什么是队列队列是一种数据结构,用于存储按照先进先出(FIFO)方式排列的元素。

类似于现实生活中的排队现象,先来的人先被服务,后来的人需要等待。

队列可用于解决一些特定的问题,如处理任务、模拟事件等。

2. 队列的特点•先进先出:队列中的元素按照入队顺序依次排列,新元素只能在队列的末尾加入,而只能从队列的头部取出元素。

•后进后出:队列中的元素只能在队列的末尾加入,而只能从队列的头部取出元素。

3. 队列的基本操作方法队列的基本操作方法包括:- 入队(enqueue):将新元素加入到队列的末尾。

- 出队(dequeue):从队列的头部取出并删除元素。

- 获取队首元素(peek):返回队列头部的元素,但不删除它。

- 判断队列是否为空(isEmpty):如果队列中没有元素,返回True;否则返回False。

第三节:示范操作1. 创建队列class Queue:def__init__(self):self.items = []def enqueue(self, item):self.items.append(item)def dequeue(self):if not self.isEmpty():return self.items.pop(0)def peek(self):if not self.isEmpty():return self.items[0]def isEmpty(self):return len(self.items) ==02. 示例操作# 创建队列q = Queue()# 入队操作q.enqueue(10)q.enqueue(20)q.enqueue(30)# 出队操作print(q.dequeue()) # 输出10# 获取队首元素print(q.peek()) # 输出20# 判断队列是否为空print(q.isEmpty()) # 输出False第四节:队列的应用1. 消息队列消息队列是一种常见的应用场景,用于解耦发送者和接收者之间的数据传输。

队列教案法

队列教案法

队列教案法一、教学目标。

1.了解队列的基本概念和特点。

2.掌握队列的基本操作,包括入队、出队、获取队首元素等。

3.能够应用队列解决实际问题。

二、教学重点和难点。

1.队列的基本概念和特点是本节课的重点。

2.队列的基本操作是本节课的难点。

三、教学内容。

1.队列的概念和特点。

队列是一种先进先出(FIFO)的数据结构,类似于排队等待服务的过程。

队列有两个基本操作,入队(enqueue)和出队(dequeue)。

入队是将元素添加到队列的末尾,而出队是从队列的首部移除元素。

队列还有一个特点是获取队首元素,即获取队列中的第一个元素但不将其移除。

2.队列的基本操作。

入队,将元素添加到队列的末尾。

出队,从队列的首部移除元素。

获取队首元素,获取队列中的第一个元素但不将其移除。

3.队列的应用。

队列常用于解决需要按照先进先出顺序处理的问题,比如计算机系统中的任务调度、打印队列等。

四、教学过程。

1.导入新知识。

通过一个简单的例子引入队列的概念和特点,比如排队买票或者排队上厕所的情景。

2.讲解队列的基本概念和特点。

通过讲解和示意图展示队列的基本概念和特点,让学生理解队列的FIFO特性。

3.讲解队列的基本操作。

通过示例和实际操作演示队列的基本操作,让学生掌握队列的入队、出队和获取队首元素等操作。

4.练习和训练。

给学生一些练习题目,让他们通过实际操作巩固队列的基本操作。

5.拓展应用。

通过一些实际问题的解决,让学生理解队列的应用场景,比如计算机系统中的任务调度、打印队列等。

6.总结和反馈。

对本节课的内容进行总结,让学生对队列的概念和基本操作有一个清晰的认识,并对学生的学习情况进行反馈。

五、教学方法。

1.示例法,通过具体的例子引入队列的概念和特点,让学生更容易理解。

2.操作演示法,通过实际操作演示队列的基本操作,让学生掌握队列的入队、出队和获取队首元素等操作。

3.问题解决法,通过实际问题的解决,让学生理解队列的应用场景,加深对队列的理解。

《数据结构与算法》PPT课堂课件-第4章-队列

《数据结构与算法》PPT课堂课件-第4章-队列

y^
front
rear
x出队
x
y^
front
rear
y出队
^
2021/6/13
front rear
5
4.3 队列的顺序存储结构
¡ 实现:用一维数组实现sq[M]
front=-1 rear=-1
队空
5
5
5
4
4
4
3
rear
2
J3
1 rear J2
3 rear 2 front
1 front
J3 J2
3 2 1
印机就从缓冲区中按照先进先出的原则依次读取数据
并打印,这样做即保证了打印数据的正确性,又提高
了主机的使用效率。由此可见,打印机缓冲区实际上
就是一个队列结构。
2021/6/13
10
【举例3】CPU分时系统
§
在一个带有多个终端的计算机系统中,同时有多
个用户需要使用CPU运行各自的应用程序,它们分别
通过各自的终端向操作系统提出使用CPU的请求,操
012345678 cq 2 3 4 5 6 7 8 9
f 0
1
2
3
4
5
6
7
8r
newr 0 1 0 0 0 0 0 0 0
012345678
result 1 0 0 0 0 0 0 0 0
2021/6/13
16
¡ 算法描述
R={ (2,8), (9,4), (2,9), (2,1), (2,5), (6,2), (5,9), (5,6), (5,4), (7,5), (7,6), (3,7), (6,3) }
列。
2021/6/13

队列训练教学法教案

队列训练教学法教案

队列训练教学法教案一、引言队列(Queue)是计算机科学中常用的数据结构之一,它按照先进先出(FIFO)的原则进行元素的操作和访问。

队列训练教学法旨在通过模拟队列的操作过程,培养学生的逻辑思维能力和问题解决能力。

本教案将介绍如何使用队列训练教学法进行教学,并提供相应的实践案例。

二、教学目标通过本教学,学生应能够:1.理解队列的基本概念和特点;2.掌握队列的基本操作,包括入队和出队;3.能够运用队列解决实际问题;4.培养学生的逻辑思维和问题解决能力。

三、教学内容3.1 队列的定义队列是一种线性数据结构,它按照先进先出的原则进行元素的操作和访问。

队列可以用数组或链表实现。

3.2 队列的基本操作队列的基本操作包括:•入队(enqueue):将元素插入队列的末尾;•出队(dequeue):将队列中的第一个元素移除,并返回移除的元素的值;•队列是否为空(isEmpty):判断队列中是否还有元素;•队列的长度(size):返回队列中元素的个数。

3.3 队列训练教学法队列训练教学法是一种通过模拟队列操作过程进行教学的方法,它可以帮助学生理解队列的特点和操作。

具体步骤如下:1.准备一个模拟队列的容器,可以是数组或链表;2.将容器的一端作为队列的头部,另一端作为队列的尾部;3.将容器的头部设为出队的地方,尾部设为入队的地方;4.引导学生进行入队和出队操作,观察容器的变化;5.引导学生总结队列的特点和操作。

四、教学案例以银行排队叫号为例,进行队列训练教学法的实践。

4.1 教学准备准备一个模拟队列的容器,可以是一个数组,也可以是一个链表。

4.2 教学步骤1.将容器的一端设为队列的头部,另一端设为队列的尾部;2.引导学生进行模拟排队操作,将顾客依次入队;3.当服务员叫号时,从队列的头部出队一个顾客;4.观察队列的变化,继续进行入队和出队操作,直到队列为空。

4.3 教学总结在教学实践过程中,引导学生总结队列的特点和操作:•队列的元素按照入队的顺序排列,先入队的元素先出队;•入队操作会在队列的尾部添加一个元素;•出队操作会将队列的头部元素移除,并返回移除的元素的值;•队列可以用于模拟实际生活中的排队情况。

队列教学法教案

队列教学法教案

队列教学法教案1. 引言队列是一种常见的数据结构,它具有先进先出(FIFO)的特点。

在计算机科学中,队列被广泛应用于操作系统、网络通信、算法设计等领域。

在教学中,队列教学法也是一种常见的教学方法,它可以帮助学生更好地理解队列的概念和应用。

本文将介绍队列教学法的教学目标、教学内容、教学方法和教学评价,希望能够帮助教师更好地运用队列教学法进行教学。

2. 教学目标通过本次教学,学生应该能够:•理解队列的概念和特点;•掌握队列的基本操作,包括入队、出队、队列长度等;•理解队列的应用场景,包括操作系统、网络通信、算法设计等;•能够运用队列解决实际问题。

3. 教学内容3.1 队列的概念和特点队列是一种线性数据结构,它具有先进先出(FIFO)的特点。

队列通常包括两个基本操作:入队和出队。

入队操作将一个元素插入到队列的末尾,出队操作将队列的第一个元素删除并返回。

队列还具有以下特点:•队列的长度可以动态变化,但是一般有一个最大长度限制;•队列的第一个元素是最先进入队列的元素,队列的最后一个元素是最后进入队列的元素;•队列可以为空,也可以满。

3.2 队列的基本操作队列的基本操作包括:•初始化队列;•判断队列是否为空;•判断队列是否已满;•入队操作;•出队操作;•获取队列长度。

3.3 队列的应用场景队列在计算机科学中有广泛的应用场景,包括:•操作系统中的进程调度;•网络通信中的数据传输;•算法设计中的广度优先搜索等。

3.4 队列的实际应用队列在实际应用中也有很多场景,例如:•餐厅排队等候;•电影院排队购票;•网络请求队列等。

4. 教学方法4.1 讲解法首先,教师可以通过讲解的方式介绍队列的概念和特点,以及队列的基本操作和应用场景。

在讲解的过程中,可以通过图示和实例来帮助学生更好地理解队列的概念和应用。

4.2 演示法其次,教师可以通过演示的方式来展示队列的基本操作和应用场景。

例如,可以通过编写一个简单的队列程序来演示队列的入队、出队和获取队列长度等操作。

队列教学法教案

队列教学法教案

队列教学法教案
以下是一个使用队列教学法的教案示例:
目标:教授学生关于数学序列和队列的概念和应用。

活动1:队列规则介绍
解释队列是什么。

队列是一种线性数据结构,其中元素按照顺序排列。

强调队列的几个基本规则:先进先出(FIFO),后面的人先得到服务。

展示一个简单的队列例子,如排队购买商品。

活动2:创建队列
让学生们按照一定的顺序排列,形成队列。

通过前后两个人相互确认的方式,让学生们理解队列的顺序性。

教师示范如何从队列中加入和移除元素。

活动3:队列的应用
解释队列在日常生活中的应用,如超市结账、交通信号灯等。

通过案例分析,让学生们理解队列在解决实际问题中的应用。

活动4:编程中的队列
介绍编程中队列的概念和用途,如缓冲区、事件循环等。

通过编程实例,让学生们理解如何在程序中使用队列。

活动5:实践操作
分组,让学生们在小组内模拟队列操作,例如模拟银行排队系统。

教师观察并指导,纠正错误。

学生分享自己的体验和感受。

总结与评估:
教师总结队列的概念、规则和应用。

通过小组报告和口头反馈,评估学生的学习效果。

鼓励学生在日常生活中应用队列原则,培养他们的解决问题的能力。

数据结构第四章队列教案

数据结构第四章队列教案

4.出队 ( 从链头取出一个元素)
Q.front Q.rear
a1
p
a2
an ∧
p=Q.front;
Q.front=p->next;
delete p;
出队的一种特殊情况
( 只有一个结点时)
Q.front Q.rear
a1 ∧
p
p=Q.front; Q.front=p->next; if Q.front=NULL
循环队列判定条件:
Q.rear 9 10
判空条件:
i
8
7 6
j
Q.front Q.front==Q.rear 11 Q.rear 初始空表: 0 k
h g f
e d
a 1 a,b,c,d, e,f,g,h b 2 c 判满条件: 11个元素 i,j,k,
3 k=(Q.rear+1)%QueueMaxSize 进队列 5 4 k == Q.front
进队: 出队:
Q.rear
队尾
Q.rear++; Q. queue[Q.rear]=i; Q.front++; x=Q. queue[Q.front];
10
9 8
11
0 1 2
7
6 5 4 3
求余: X %12 结果在 0~11之间
Q.rear++; 改为 Q.front++; 改为 Q.rear=(Q.rear+1)%QueueMaxSize; Q.front=(Q.front+1)%QueueMaxSize;
Q.front==Q.rear=0
循环队列的基本操作:

队列动作教案

队列动作教案

队列动作教案一、教学目标1.了解队列的概念和特点;2.掌握队列的基本操作;3.能够应用队列解决实际问题。

二、教学内容1. 队列的概念和特点队列是一种线性数据结构,它具有先进先出(FIFO)的特点,即先进入队列的元素先被取出。

队列通常有两个端点,一端称为队头,另一端称为队尾。

队头指向队列中第一个元素,队尾指向队列中最后一个元素。

队列的特点包括:•只能在队尾插入元素,在队头删除元素;•队列的长度是动态变化的,可以根据实际情况进行扩容或缩容;•队列的操作是原子性的,即队列的操作要么全部完成,要么全部不完成。

2. 队列的基本操作队列的基本操作包括:•初始化队列;•判断队列是否为空;•判断队列是否已满;•入队操作;•出队操作;•获取队头元素;•获取队列长度。

2.1 初始化队列队列的初始化是指创建一个空队列。

队列的初始化可以通过以下代码实现:#define MAXSIZE 100// 定义队列的最大长度typedef struct{int data[MAXSIZE];// 存储队列元素的数组int front;// 队头指针int rear;// 队尾指针} Queue;void InitQueue(Queue *Q){Q->front = Q->rear =0;// 队头和队尾指针都指向0}2.2 判断队列是否为空判断队列是否为空可以通过判断队头和队尾指针是否相等来实现。

如果队头和队尾指针相等,则说明队列为空。

代码如下:int IsEmpty(Queue Q){if(Q.front == Q.rear){return1;// 队列为空}else{return0;// 队列不为空}}2.3 判断队列是否已满判断队列是否已满可以通过判断队尾指针是否等于队列的最大长度减1来实现。

如果队尾指针等于队列的最大长度减1,则说明队列已满。

代码如下:int IsFull(Queue Q){if(Q.rear == MAXSIZE -1){return1;// 队列已满}else{return0;// 队列未满}}2.4 入队操作入队操作是指将一个元素插入到队列的队尾。

队列练习教案

队列练习教案

队列练习教案队列练习教案一、教学目标:1.了解队列的定义和特点;2.能够理解并使用队列的基本操作;3.能够利用队列解决问题。

二、教学重点:1.队列的定义和特点;2.队列的基本操作;3.利用队列解决问题。

三、教学过程:1.导入新知识介绍队列的概念和特点。

队列是一种先进先出(First In First Out,FIFO)的数据结构,类似于现实生活中的排队现象。

2.引入队列的基本操作(1)入队:将元素插入队列的末尾;(2)出队:将队列的首元素删除并返回;(3)取队首元素:返回队列的首元素;(4)判断队列是否为空;(5)判断队列是否已满。

3.练习队列的基本操作由教师进行示范操作,学生进行跟随操作。

4.组织学生进行练习(1)练习1:使用队列模拟银行排队取号的过程。

要求:每个学生随机生成一个号码,按照号码顺序排队。

每秒钟随机生成一个取号人员,进行出队操作,并输出当前队列的情况。

(2)练习2:使用队列模拟电影院排队购买电影票的过程。

要求:每个学生随机生成一个排队序号,按照序号顺序排队。

每秒钟随机生成一个购票人员,进行出队操作,并输出当前队列的情况。

5.总结和反思总结队列的特点和基本操作,思考队列在实际问题中的应用。

四、板书设计队列- 队列是一种先进先出(FIFO)的数据结构- 入队- 出队- 取队首元素- 判断队列是否为空- 判断队列是否已满五、教学资源1.教学PPT;2.教学练习题。

六、教学评价1.观察学生的学习情况,评价其对队列的理解和运用;2.听取学生对队列应用问题的解决方案的陈述,评价其解决问题的思路和能力;3.参考学生的实际操作情况,评价其对队列的基本操作的掌握情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Q.front==Q.rear=0
循环队列的基本操作:
将新元素item的值插入到队尾 void Qinsert(QueueType& Q, const ElemType& item);
从队列Q中删除队首元素并返回之 ElemType Qdelete (QueueType& Q);
进队 (将新元素item的值插入到队尾)
2. 队列的链接存储结构
struct LNode { ElemType data; LNode *next; };
链队列类型 struct LinkQueue{ LNode *front; LNode *rear; };
Q.front Q.rear
//队头指针 //队尾指针
a1
a2

an ∧
1.初始化
delete p; p=Q.front;
2.清除链队为空
void ClearQueue(LinkQueue& HQ) //清除链队中的所有结点,使之成为空队 { LNode* p=Q.front; while(p!=NULL) { Q.front=Q.front->next; delete p; p=Q.front; } Q.rear=NULL; } //置队尾指针为空
24 24 24 24 24 24
程序运行: 5 进队,
24 出队
i值 5
队中元素 78 58 62 5
78 58 62 5
24
while 循环 78 出队
58 出队 62 出队 5 出队
程序2:
#include<iostream.h> #include<stdlib.h> typedef int ElemType; struct LNode { ElemType data; LNode* next; }; struct LinkQueue { LNode* front; LNode* rear; };
4.4 队列 4.4.1 队列的定义
循环队列—Leabharlann 顺序映象链队列——链式映象
队列的顺序存储结构
struct Queue
{
ElemType queue[QueueMaxSize];
int front, rear; };
队头
0 1 2 3 4 5 6 7 8
QueueMaxSize-1
(a) (b)(c) d e f g h Q.front
3.进队 ( 向链队中插入一个元素)
Q.front Q.rear
a1
a2

an ∧
an+1
/\
Q.rear->next=newptr; Q.rear=newptr; newptr
void Qinsert (LinkQueue &Q, const ElemType &item) { LNode *newptr = new LNode; …… //分配新结点 newptr->data = item; p->next = NULL; if (Q.rear==NULL; //空队列 Q.front=Q.rear=newptr; //第一个结点 else { Q.rear=newptr; Q.rear->next=newptr;} }
Q.rear=NULL;
delete p;
ElemType QDelete(LinkQueue& Q) { if(Q.front==NULL) //判空 { cerr<<"queue is empty!"<<endl; exit(1); } ElemType temp=Q.front->data; LNode* p=Q.front; Q.front=p->next; if(Q.front==NULL) Q.rear=NULL; delete p; return temp; }
出队 ( 删除队首元素并返回之)
ElemType QDelete(Queue& Q)
{ if(Q.front==Q.rear) //判空 { cerr<<"Queue is empty!"<<endl; exit(1); } Q.front=(Q.front+1)%QueueMaxSize; //移动尾指针 return Q.queue[Q.front]; } //返回队首元素
进队: 出队:
Q.rear
队尾
Q.rear++; Q. queue[Q.rear]=i; Q.front++; x=Q. queue[Q.front];
10
9 8
11
0 1 2
7
6 5 4 3
求余: X %12 结果在 0~11之间
Q.rear++; 改为 Q.front++; 改为 Q.rear=(Q.rear+1)%QueueMaxSize; Q.front=(Q.front+1)%QueueMaxSize;
程序1功能: #include //结构定义…… #include …… void main() { …… for(int i=0; i<6; i++) { //两个随机数进队 } //一个出队 while(!QueueEmpty(q)) { // 队中元素出队 } }
程序运行:
i值 队中元素( 6 ) 41 进队, 67 进队 0 41 67 41 出队 67 34 进队,0 进队 1 67 34 0 67 出队 34 0 69 进队, 24 进队 2 34 0 69 34 出队 0 69 78 进队, 58 进队 3 78 58 0 69 0 出队 78 58 69 62 进队, 4 78 58 62 69 69 出队 78 58 62
cout<<endl; while(!QueueEmpty(q)) {
cout<<QDelete(q)<<" 出队"<<endl;
}
程序1:
#include<iostream.h> #include<stdlib.h> const int QueueMaxSize=6; typedef int ElemType; struct Queue { ElemType queue[QueueMaxSize]; int front, rear; }; #include"queue.h"
41 67 34 0 69 24 78 58 62 64 5 45 81 27 61 91 95 42 27 36 41 34 67 0 69 24 5 78 45 58 81 62 27 64 61 42 91 36
循环队列判定条件:
Q.rear 9 10
判空条件:
i
8
7 6
j
Q.front Q.front==Q.rear 11 Q.rear 初始空表: 0 k
h g f
e d
a 1 a,b,c,d, e,f,g,h b 2 c 判满条件: 11个元素 i,j,k,
3 k=(Q.rear+1)%QueueMaxSize 进队列 5 4 k == Q.front
void InitQueue(LinkQueue& Q) //把队首和队尾指针置为空 { Q.front=Q.rear=NULL;
}
空队列
Q.front Q.rear
NULL
2.清除链队为空
Q.front Q.rear
a1
p
a2
p

an ∧
p=Q.front
循环
Q.front=Q.front->next;
void Qinsert (Queue& Q, const ElemType& item) { int k=(Q.rear+1)%QueueMaxSize; //求出队尾的下一个位置 if(k==Q.front) //判满 { cerr<<"Queue overflow!"<<endl; exit(1); } Q.rear=k; //移动尾指针 Q.queue[k]=item; //赋值给队尾 }
for(int i=0; i<20; i++) { int x=rand()%100; cout<<x<<" "; if(x%2==1) QInsert(q1,x); //用q1链队存放奇数 else QInsert(q2,x); //用q2链队存放偶数 }
while(!QueueEmpty(q1) &&!QueueEmpty(q2)) { //每一行输出一个奇数和 一个偶数,直到任一队列空为止 cout<<QDelete(q1)<<“ "<<QDelete(q2)<<endl; }
4.出队 ( 从链头取出一个元素)
Q.front Q.rear
a1
p
a2
an ∧
p=Q.front;
Q.front=p->next;
delete p;
出队的一种特殊情况
( 只有一个结点时)
Q.front Q.rear
a1 ∧
p
p=Q.front; Q.front=p->next; if Q.front=NULL
4.4.5 使用队列的程序举例
程序1: #include …… #include …… void main() { …… for(int i=0; i<6; i++) { …… } while(!QueueEmpty(q)) { …… } }
相关文档
最新文档