递 归 (recursion)  定义 : 若一个对象部分地包含它自己, 或用 它自己给自己定义, 则称这个对象是递归的; 若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。  三种递归情况   定义是递归的  数据结构是递归的  问题的解法是递归的.

Slides:



Advertisements
Similar presentations
首 页 首 页 上一页 下一页 本讲内容 投影法概述三视图形成及其投影规律平面立体三视图、尺寸标注 本讲内容 复习: P25~P31 、 P84~P85 作业: P7, P8, P14[2-32(2) A3 (1:1)]
Advertisements

纺纱学. 2 绪 论 基本要求:了解纺纱系统的类别 重点掌握:棉纺系统的工艺流程 3 一、纺纱原理与设备 纺纱:用物理或机械的方法将纺织纤维纺成纱 线的过程。 纺纱原理:初加工、原料的选配、开松除杂、 混和、梳理、精梳、并合、牵伸、加捻、卷绕等。 纺纱方法:传统纺纱方法、新型纺纱方法。 纺纱设备:开清棉联合机、梳棉机、精梳机、
第十二章 常微分方程 返回. 一、主要内容 基本概念 一阶方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程.
概率统计( ZYH ) 节目录 2.1 随机变量与分布函数 2.2 离散型随机变量的概率分布 2.3 连续型随机变量的概率分布 第二章 随机变量及其分布.
概率统计( ZYH ) 节目录 3.1 二维随机变量的概率分布 3.2 边缘分布 3.4 随机变量的独立性 第三章 随机向量及其分布 3.3 条件分布.
基本知识和几何要素的投影 模块一: 字体练习 第一章 制图的基本知识与基本技能 题目提示返回.
第 12 章位运算 C 语言兼具高级语言及低级语言的特性,因此 适合编写系统软件。 C 语言具备低级语言的特性 就在于它能直接对硬件进行操作,即位运算。 所谓位运算是指,按二进制位进行的运算。 例如,将一个存储单元中各二进位左移或右移一 位等。
细分曲面 傅孝明 SA 目录 细分曲面的基本思想 两个关键问题 一些基本概念 几种简单的细分曲面算法 细分曲面方法分类.
一、拟合优度检验 二、变量的显著性检验 三、参数的置信区间
4 第四章 矩阵 学时:  18 学时。 教学手段:  讲授和讨论相结合,学生课堂练习,演练习题与辅导答疑相结合。 基本内容和教学目的:  基本内容: 矩阵的运算,可逆矩阵,初等矩阵及其性质和意义, 分块矩阵。  教学目的:  1 .使学生理解和掌握矩阵等价的相关理论  2 .能熟练地进行矩阵的各种运算.
主要内容  LR(0) 分析. 0 S→  E # E→  E+T E→  T T→  id T→  ( E ) 1 S→E  # E→E  +T 5 T→id  3 E→E+  T T→  id T→  (E) 4 E→E+T  9 E→T  6 T→(  E) E→
嵌入式操作系统 陈香兰 Fall 系统调用 10/27/09 嵌入式 OS 3/12 系统调用的意义  操作系统为用户态进程与硬件设备进行交互提供 了一组接口 —— 系统调用  把用户从底层的硬件编程中解放出来  极大的提高了系统的安全性  使用户程序具有可移植性.
系统调用 Embedded Operating Systems2 系统调用的意义 操作系统为用户态进程与硬件设备进行交互提 供了一组接口 —— 系统调用 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性.
第 4 章 抽象解释 内容概述 以一种独立于编程语言的方式,介绍抽象解释的 一些本质概念 – 将 “ 程序分析对语言语义是正确的 ” 这个概念公式 化 – 用 “ 加宽和收缩技术 ” 来获得最小不动点的较好的 近似,并使所需计算步数得到限制 – 用 “ 伽罗瓦连接和伽罗瓦插入 ” 来把代价较大的属 性空间用代价较小的属性空间来代替.
第 2 章 数据流分析 内容概述 数据流分析推导的是数据沿着程序执行路 径流动的信息 – 过程内的分析:可用表达式分析、到达-定值分 析等 – 过程间分析 –Shape 分析 – 理论基础 – 数据流方程的求解.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第六十二讲 ) 离散数学. 最后,我们构造能识别 A 的 Kleene 闭包 A* 的自动机 M A* =(S A* , I , f A* , s A* , F A* ) , 令 S A* 包括所有的 S A 的状态以及一个 附加的状态 s.
1 为了更好的揭示随机现象的规律性并 利用数学工具描述其规律, 有必要引入随 机变量来描述随机试验的不同结果 例 电话总机某段时间内接到的电话次数, 可用一个变量 X 来描述 例 检测一件产品可能出现的两个结果, 也可以用一个变量来描述 第五章 随机变量及其分布函数.
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 3 章 曲线拟合的最小二乘法 给出一组离散点,确定一个函数逼近原函数,插值是这样 的一种手段。在实际中,数据不可避免的会有误差,插值函 数会将这些误差也包括在内。
例9:例9: 第 n-1 行( -1 )倍加到第 n 行上,第( n-2 ) 行( -1 )倍加到第 n-1 行上,以此类推, 直到第 1 行( -1 )倍加到第 2 行上。
主讲教师:陈殿友 总课时: 124 第八讲 函数的极限. 第一章 机动 目录 上页 下页 返回 结束 § 3 函数的极限 在上一节我们学习数列的极限,数列 {x n } 可看作自变量 为 n 的函数: x n =f(n),n ∈ N +, 所以,数列 {x n } 的极限为 a, 就是 当自变量 n.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第三十八讲 ) 离散数学. 第八章 格与布尔代数 §8.1 引 言 在第一章中我们介绍了关于集 合的理论。如果将 ρ ( S )看做 是集合 S 的所有子集组成的集合, 于是, ρ ( S )中两个集合的并 集 A ∪ B ,两个集合的交集.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第四十八讲 ) 离散数学. 例 设 S 是一个非空集合, ρ ( s )是 S 的幂集合。 不难证明 :(ρ(S),∩, ∪,ˉ, ,S) 是一个布尔代数。 其中: A∩B 表示 A , B 的交集; A ∪ B 表示 A ,
第十一章 曲线回归 第一节 曲线的类型与特点 第二节 曲线方程的配置 第三节 多项式回归.
实验一: 信号、 系统及系统响应 1 、实验目的 1 熟悉连续信号经理想采样前后的频谱变化关系, 加深对时 域采样定理的理解。 2 熟悉时域离散系统的时域特性。 3 利用卷积方法观察分析系统的时域特性。 4 掌握序列傅里叶变换的计算机实现方法, 利用序列的傅里 叶变换对连续信号、 离散信号及系统响应进行频域分析。
线性代数习题课 吉林大学 术洪亮 第一讲 行 列 式 前面我们已经学习了关 于行列式的概念和一些基本 理论,其主要内容可概括为:
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第二十五讲 ) 离散数学. 定理 群定义中的条件 ( 1 )和( 2 )可以减弱如下: ( 1 ) ’ G 中有一个元素左壹适合 1 · a=a; ( 2 ) ’ 对于任意 a ,有一个元素左逆 a -1 适 合 a -1 ·
第 4 章 过程与变量的作用范围. 4.1 Visual Basic 的代码模块 Visual Basic 的应用程序是由过程组成的, 过程代码存放在模块中。 Visual Basic 提供了 三类模块,它们是窗体模块、标准模块和类 模块。 窗体模块 窗体模块是大多数 Visual Basic.
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 3 章 曲线拟合的最小二乘法 给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。 在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。
自顶向下分析 —— 递归下降法 递归下降法 (Recursive-Descent Parsing) 对每个非终极符按其产生式结构产生相应语 法分析子程序. 终极符产生匹配命令 非终极符则产生调用命令 文法递归相应子程序也递归,所以称这种方 法为递归子程序方法或递归下降法。
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第三十九讲 ) 离散数学. 例 设 S 是一个集合, ρ ( S )是 S 的幂集合,集合 的交( ∩ ),并(∪)是 ρ ( S )上的两个代数运算, 于是,( ρ ( S ), ∩ ,∪) 是一个格。而由例 知.
实验三: 用双线性变换法设计 IIR 数字滤波器 一、实验目的 1 熟悉用双线性变换法设计 IIR 数字滤波器的原理与方法。 2 掌握数字滤波器的计算机仿真方法。 3 通过观察对实际心电图信号的滤波作用, 获得数字滤波的感性知 识。
OS 进程调度模拟演示 制作人: 钱晶 高上上. OS 进程调度模拟-实验原理 静态优先级原理 在这种方式下,系统一旦把处理机分配给就绪队 列中的优先权最高的进程后,该进程便一直执行下去, 直至完成。或因为发生某事件使该进程放弃处理机,系 统方可再将处理机分配给另一优先级最高的进程。这些 事件包括有优先级更高的进程进入,或是因为某些原因.
量子化学 第四章 角动量与自旋 (Angular momentum and spin) 4.1 动量算符 4.2 角动量阶梯算符方法
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 5 章 解线性方程组的直接法 实际中,存在大量的解线性方程组的问题。很多数值方 法到最后也会涉及到线性方程组的求解问题:如样条插值的 M 和.
主讲教师:陈殿友 总课时: 124 第十一讲 极限的运算法则. 第一章 二、 极限的四则运算法则 三、 复合函数的极限运算法则 一 、无穷小运算法则 机动 目录 上页 下页 返回 结束 §5 极限运算法则.
在发明中学习 线性代数 概念的引入 李尚志 中国科学技术大学. 随风潜入夜 : 知识的引入 之一、线性方程组的解法 加减消去法  方程的线性组合  原方程组的解是新方程的解 是否有 “ 增根 ” ?  互为线性组合 : 等价变形  初等变换  高斯消去法.
第十章 目标代码生成  目标代码 ( 单寄存器 )  临时变量的存储空间分配  寄存器的分配和释放.
东南大学计算中心 网站应用与实践 主讲人 吴俊. 2 东南大学计算中心 网站制作流程  确定主题、风格  规划栏目、收集素材  版面设计、配色  编辑页面  测试发布 FrontPage 要完成的任务.
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 7 章 矩阵的特征值和特征向量 很多工程计算中,会遇到特征值和特征向量的计算,如: 机械、结构或电磁振动中的固有值问题;物理学中的各种临界 值等。这些特征值的计算往往意义重大。
1 学籍归档工作 年学籍归档工作安排 从 2008 年开始,改为按届移交档案 从 2008 年开始,改为按届移交档案 今年的归档工作范围: 今年的归档工作范围: 2014 年应届毕业班级 2014 年应届毕业班级 2014 年办理毕业证的往届生。 2014 年办理毕业证的往届生。 整理内容:根据.
第一节 相图基本知识 1 三元相图的主要特点 (1)是立体图形,主要由曲面构成; (2)可发生四相平衡转变; (3)一、二、三相区为一空间。
量子力学教程 ( 第二版 ) 3.4 连 续 谱 本 征 函 数 的 归 一 化 连续谱本征函数是不能归一化的 一维粒子的动量本征值为的本征函数 ( 平面波 ) 为 可以取 中连续变化的一切实数值. 不难看出,只要则 在量子力学中, 坐标和动量的取值是连续变化 的 ; 角动量的取值是离散的.
第 3 章 控制流分析 内容概述 – 定义一个函数式编程语言,变量可以指称函数 – 以 dynamic dispatch problem 为例(作为参数的 函数被调用时,究竟执行的是哪个函数) – 规范该控制流分析问题,定义什么是可接受的控 制流分析 – 定义可接受分析在语义模型上的可靠性 – 讨论分析算法.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第五十三讲 ) 离散数学. 定义 设 G= ( V , T , S , P ) 是一个语法结构,由 G 产生的语言 (或者说 G 的语言)是由初始状态 S 演绎出来的所有终止符的集合, 记为 L ( G ) ={w  T *
编译原理总结. 基本概念  编译器 、解释器  编译过程 、各过程的功能  编译器在程序执行过程中的作用  编译器的实现途径.
周期信号的傅里叶变换. 典型非周期信号 ( 如指数信号, 矩形信号等 ) 都是满足绝对可 积(或绝对可和)条件的能量信号,其傅里叶变换都存在, 但绝对可积(或绝对可和)条件仅是充分条件, 而不是必 要条件。引入了广义函数的概念,在允许傅里叶变换采用 冲激函数的前提下, 使许多并不满足绝对可积条件的功率.
 符号表  标识符的作用: 声明部分:定义了各种对象及对应的属性和 使用规则。 程序体:对所定义的对象进行各种操作。 $ididname IdnameAttributeIR  必要性 Token : 新表-符号表(种类、类型等信息):
Department of Mathematics 第二章 解析函数 第一节 解析函数的概念 与 C-R 条件 第二节 初等解析函数 第三节 初等多值函数.
1 第 7 章 存储过程、触发器和程序包 在很多时候,都需要保存 PL/SQL 程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的 PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的 PL/SQL 程序块。
首 页 首 页 上一页 下一页 本讲内容本讲内容 视图,剖视图(Ⅰ) 复习: P107 ~ P115 作业: P48(6-2,6-4), P49( 去 6-6) P50, P51(6-13), P52 P50, P51(6-13), P52 P53 (6-18,6-20) P53 (6-18,6-20)
《 UML 分析与设计》 交互概述图 授课人:唐一韬. 知 识 图 谱知 识 图 谱知 识 图 谱知 识 图 谱.
Introduction to Automatic Control The Laplace Transform Li Huifeng Tel:
1 、如果 x + 5 > 4 ,那么两边都 可得 x >- 1 2 、在- 3y >- 4 的两边都乘以 7 可得 3 、在不等式 — x≤5 的两边都乘以- 1 可得 4 、将- 7x — 6 < 8 移项可得 。 5 、将 5 + a >- 2 a 移项可得 。 6 、将- 8x < 0.
项目七: PLC 功能指令应用 带进位循环左移指令 XXXXX. 项目七: PLC 功能指令应用 FX2 系列可编程控制器移位控制指令有移位、循环移位、字移位 及先进先出 FIFO 指令等 10 条指令。 带进位循环右移指令 RCR 带进位循环左移指令 RCL 字右移位指令 WSFR 先入先出读出指令.
§10.2 对偶空间 一、对偶空间与对偶基 二、对偶空间的有关结果 三、例题讲析.
表单自定义 “ 表单自定义 ” 功能是用于制作表单的 工具,用数飞 OA 提供的表单自定义 功能能够快速制作出内容丰富、格 式规范、美观的表单。
7 生产费用在完工产品与在产 品之间分配的核算. 2 第七章 生产费用在完工产品与在产品之 间的分配  知识点 :  理解在产品的概念  掌握生产费用在完工产品与在产品之间的分 配.
力的合成 力的合成 一、力的合成 二、力的平行四边形 上一页下一页 目 录 退 出. 一、力的合成 O. O. 1. 合力与分力 我们常常用 一个力来代替几个力。如果这个 力单独作用在物体上的效果与原 来几个力共同作用在物体上的效 果完全一样,那么,这一个力就 叫做那几个力的合力,而那几个 力就是这个力的分力。
第四章 不定积分. 二、 第二类换元积分法 一、 第一类换元积分法 4.2 换元积分法 第二类换元法 第一类换元法 基本思路 设 可导, 则有.
逻辑设计基础 1 第 7 章 多级与(或)非门电路 逻辑设计基础 多级门电路.
“ 百链 ” 云图书馆. 什么是百链云图书馆?1 百链云图书馆的实际效果?2 百链云图书馆的实现原理?3 百链云图书馆的价值?44 图书馆要做什么?55 提 纲.
1 第 4 章 速度瞬心及其应用 ● 利用速度瞬心进行机构的速度分析 ● 将低副机构转变为高副机构 ( 瞬心线机 构,共轭曲线机构) ● 用低副机构的分析方法对高副机构进 行结构和运动分析 ( 高副低代 )
参考文献管理软件. 常见参考文献管理软件 : 中文 : CNKI E-learning (目前免费) NoteExpress NoteFirst 英文: Refworks Endnote (网络版免费) Mendeley……
八. 真核生物的转录 ㈠ 特点 ① 转录单元为单顺反子( single cistron ),每 个蛋白质基因都有自身的启动子,从而造成在功能 上相关而又独立的基因之间具有更复杂的调控系统。 ② RNA 聚合酶的高度分工,由 3 种不同的酶催化转 录不同的 RNA 。 ③ 需要基本转录因子与转录调控因子的参与,这.
一、 版 面 构 成 的 概 念 版 面 构 成 的 概 念 二、 版 面 构 成 的 发 展 趋 势 版 面 构 成 的 发 展 趋 势 三、 广 告 文 字 的 版 面 构 成 广 告 文 字 的 版 面 构 成 四、 广 告 版 面 的 视 觉 流 程 广 告 版 面 的 视 觉 流 程.
数据库系统 1 §1 并发控制概述 在多用户数据库系统中,当多个用户并发存取数据 库时就会产生多个事务同时存取同一数据的情形。若不 加控制,可能会存取和存储不正确的数据,造成数据库 的不一致性。 在并发操作情况下,对事务的操作序列的调度是随 机的,考虑飞机订票系统,若按下面的序列调度:
1 第三章 数列 数列的概念 考点 搜索 ●数列的概念 ●数列通项公式的求解方法 ●用函数的观点理解数列 高考 猜想 以递推数列、新情境下的 数列为载体, 重点考查数列的通 项及性质, 是近年来高考的热点, 也是考题难点之所在.
目录 上页 下页 返回 结束 二、无界函数反常积分的审敛法 * 第五节 反常积分 无穷限的反常积分 无界函数的反常积分 一、无穷限反常积分的审敛法 反常积分的审敛法  函数 第五章 第五章.
本章讨论有限自由度结构系统,在给定载荷和初始条件激励下的系统动力响应计算方法。 第 六 章
单元四 电动后视镜控制电路. 汽车辅助装置汽车辅助装置 一、教学目的要求: 掌握电动后视镜的组成、功用、工作过程以 及控制电路 二、主要教学内容: ( 1 )电动后视镜的组成 ( 2 )电动后视镜控制电路 ( 3 )电动后视镜工作过程 三、教学重点、难点: 电动后视镜工作过程.
Presentation transcript:

递 归 (recursion)  定义 : 若一个对象部分地包含它自己, 或用 它自己给自己定义, 则称这个对象是递归的; 若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。  三种递归情况   定义是递归的  数据结构是递归的  问题的解法是递归的

定义是递归的 求解阶乘函数的递归算法 long Factorial ( long n ) { if ( n == 0 ) return 1; else return n * Factorial (n - 1); } 例如,阶乘函数

求解阶乘 n! 的过程 主程序 主程序 main : fact(4) 参数 4 计算 4*fact(3) 返回 24 参数 3 计算 3*fact(2) 返回 6 参数 2 计算 2*fact(1) 返回 2 参数 1 计算 1*fact(0) 返回 1 参数 0 直接定值 = 1 返回 1 参数传递参数传递 结果返回结果返回 递归调用递归调用递归调用递归调用 回归求值回归求值回归求值回归求值

数据结构是递归的 有若干结点的单链表 例如,单链表结构 f  f  只有一个结点的单链表

例 1. 搜索链表最后一个结点并打印其数值 void Search ( ListNode *f ) { if ( f -> next == NULL ) printf (“%d\n”, f -> data ); else Search ( f -> next ); } f ffff  a0a0 a1a1 a2a2 a3a3 a4a4 递归找链尾

例 2. 在链表中寻找等于给定值的结点, 并打印其数值 void Search ( ListNode * f, ListData x ) { if ( f ! = NULL ) if ( f -> data == x ) printf ( “ %d\n ”, f -> data ); else Search ( f -> next, x ); } 递归找含 x 值的结点 f fff  x

例如,汉诺塔 (Tower of Hanoi) 问题的解法: 如果 n = 1 ,则将这一个盘子直接从 X 柱 移到 Z 柱上。否则,执行以下三步: ① 用 Z 柱做过渡,将 X 柱上的 (n - 1) 个盘子移 到 Y 柱上: ② 将 X 柱上最后一个盘子直接移到 Z 柱上; ③ 用 X 柱做过渡,将 Y 柱上的 (n - 1) 个盘子移 到 Z 柱上。 问题的解法是递归的

 算法 void hanoi (int n, char X, char Y, char Z) { // 解决汉诺塔问题的算法 if ( n == 1 ) printf (" move %s",X, " to %s”,Z); else { Hanoi ( n-1, X, Z, Y ); printf (" move %s",X, " to %s”,Z); Hanoi ( n-1, Y, X, Z ); }

递归方法是设计非数值计算程序的重要方法,它使得程 序的结构清晰,形式简洁,易于阅读,正确性容易证明。 一般地讲,一个问题采用递归算法求解时,须具备 3 个 条件。 (1) 能将一个问题转变成一个新问题,而新问题与原问 题的解法相同或类同,所不同的仅是所处理的对象,且 这些处理对象的变化是有规律的。 (2) 可以通过上述转化使问题逐步简单化。 (3) 必须有一个明确的递归出口 ( 递归的边界 ) 。

递归过程及其实现 递归过程在实现时,需要自己调用自己。 层层向下递归,退出时的次序正好相反: 递归调用 n! (n-1)! (n-2)! 1! 0!=1 返回次序 递归函数运行的 “ 层次 ”

递归工作栈 函数嵌套调用时的 “ 后调用先返回 ” 原则 递归函数调用也是一种嵌套调用;每一次递归调用时, 也需要分配存储空间(工作区)来存储参数、局部变 量、返回地址等信息。 每层递归调用需分配的空间形成递归工作记录,按后 进先出 (LIFO) 的栈组织。 局部变量 返回地址 参 数 活动 记录 框架 递归 工作记录

函数递归时的活动记录 ………………. Function( ) ………………. 调用块 函数块 返回地址 ( 下一条指令 ) 局部变量 参数

递归过程改为非递归过程 递归过程简洁、易编、易懂 递归过程效率低,重复计算多 改为非递归过程的目的是提高效率 单向递归和尾递归可直接用迭代实现其 非递归过程 其他情形必须借助栈实现非递归过程

计算斐波那契数列的函数 Fib(n) 的定义 求解斐波那契数列的递归算法 long Fib ( long n ) { if ( n <= 1 ) return n; else return Fib (n - 1) + Fib (n - 2); } 如 F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, F 4 = 3, F 5 = 5

斐波那契数列的递归调用树 Fib(1)Fib(0) Fib(1)Fib(2) Fib(3) Fib(4) Fib(1)Fib(0) Fib(2) Fib(1)Fib(0) Fib(1)Fib(2) Fib(3) Fib(5)

Fib(1)Fib(0) Fib(2)Fib(1)Fib(0) Fib(2) Fib(1) Fib(3) Fib(4)          栈结点 n tag tag = 1, 向左递归; tag = 2, 向右递归

计算斐波那契数列的递推算法 Long FibIter(long n){ if (n <=1) return n; long twoback=0,oneback=1,current; for (int I=2;I<=n;I++){ current =twoback+oneback; twoback=oneback;oneback=current; } return current; } 事件复杂度: O(n)

队列 (Queue)  定义 : 只允许在表的一端进行插入,而在另 一端删除元素的线性表。  在队列中,允许插入的一端叫队尾 ( rear ), 允许删除的一端称为队头 (front) 。  特点: 先进先出 (FIFO) a 1 , a 2 , a 3 , … , a n 出队列入队列 队头队头 队尾队尾

链队列:队列的链式表示  链队列中,有两个分别指示队头和队尾的指针。  链式队列在进队时无队满问题,但有队空问题。 data next front rear

front rear ^ 空队列 front rear x^ 元素 x 入队 front rear x^y^ 元素 y 入队 front rear x^^y 元素 x 出队 ^

typedef int QElemType; typedef struct Qnode { QElemType data; // 队列结点数据 struct Qnode *next; // 结点链指针 } Qnode,*QueuePtr; typedef struct { QueuePtr rear, front; } LinkQueue; 链式队列的定义

链队列的主要操作 Status InitQueue ( LinkQueue &Q ) Status DestroyQueue(LinkQueue &Q) Status ClearQueue(LinkQueue &Q) Status QueueEmpty ( LinkQueue Q ) int QueueLength(LinkQueue Q) Status GetHead ( LinkQueue Q, QElemType &e) Status EnQueue(LinkQueue &Q,QElemType e) Status DeQueue(LinkQueue &Q,QElemType &e) Status QueueTraverse(LinkQueue Q,visit())

 入队 Status EnQueue ( LinkQueue &Q, QElemType e ) { p = ( QueuePtr ) malloc( sizeof ( QNode ) ); ….. p->data = e; p->next = NULL; Q.rear->next = p; // 入队 Q.rear =p; return OK; }

 出队 int DeQueue ( LinkQueue &Q, QElemType &e) { // 删去队头结点,并返回队头元素的值 if ( Q.front==Q.rear ) return ERROR;// 判队空 p = Q.front ->next; e = p->data;// 保存队头的值 Q.front->next = p->next; // 新队头 if (Q.rear == p) Q.rear = Q.front ; free (p); return OK; }

循环队列 (Circular Queue)  顺序队列 — 队列的顺序存储表示 插入新的队尾元素,尾指针增 1 , rear = rear + 1 , 删除队头元素,头指针增 1 , front = front + 1 ,  因此,在非空队列中,头指针始终指向队列头 元素,而尾指针始终指向队列尾元素的下一个 位置。  队满时再进队将溢出 假溢出(图 3.12)  解决办法:将顺序队列臆造为一个环状的空间, 形成循环 ( 环形 ) 队列

队列的进队和出队 front rear 空队列 frontrear A,B,C, D 进队 A B C D frontrear A,B 出队 C D front rear E,F,G 进队 C D E F G front rear H 进队, 溢出

循环队列 (Circular Queue)  队头、队尾指针加 1 ,可用取模 ( 余数 ) 运算实现。  队头指针进 1: front = (front+1) %maxsize;  队尾指针进 1: rear = (rear+1) % maxsize;  队列初始化: front = rear = 0;  队空条件: front == rear;  队满条件: (rear+1) % maxsize == front; 循环队列 front rear Maxsize-1

front B CD rear 一般情况 A rear 空队列 front 队满条件: (rear+1) % maxsize == front C front rear D E F G A B C 队满 C front rear D E F G A B C H

#define MAXSIZE 100 Typedef struct{ QElemType *base; int front; int rear; } SqQueue; 循环队列的类型定义

循环队列操作的实现  初始化队列 Status InitQueue ( SqQueue &Q ) { // 构造空队列 Q.base=(QElemType *) malloc (MAXSIZE*sizeof(QElemType)); if (! Q.base) exit(OVERFLOW); Q.rear = Q.front = 0; return OK; }

 入队 Status EnQueue ( SqQueue &Q, QElemType e ) { if ( (Q.rear+1) % MAXSIZE ==Q.front) return ERROR; // 队满 Q.base[Q.rear] = e; Q.rear = ( Q.rear+1) % MAXSIZE; return OK; }

 出队 Status DeQueue ( SqQueue &Q, QElemType &e ) { if ( Q.front == Q.rear ) return ERROR; // 队空 e = Q.base[Q.front]; Q.front = ( Q.front+1) % MAXSIZE; return OK; }

队列的应用 --- 离散事件模拟 银行业务模拟程序 模拟银行业务活动并计算一天中客户在银行平均逗留时间 事件驱动模拟 — 按事件(客户到达或客户离开)发生的先后 顺序进行处理 。 主要的数据结构: 一个事件表(有序链表) 用来记录待处理的事件 n 个队列 用来对应 N 个窗口的客户队列

typedef struct{ int OccurTime; int Ntype; } Event,ElemType; // 事件类型 typedef LinkList EventList // 事件链表类型 Type struct{ int ArrivalTime; int Duration; } QElemType; // 队列元素类型