Chapter 2 Entity-Relationship Model

Slides:



Advertisements
Similar presentations
两汉文学及汉代诗歌.
Advertisements

迷 宫 最短路径 施沈翔.
近现代文学概说.
動畫與遊戲設計 Data structure and artificial intelligent
数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
第三章 鏈結串列 Linked List.
数据结构——树和二叉树 1/96.
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
第二章 线性表.
第2章 线性表 2.1 线性表的概念及运算 2.2 线性表的顺序存储 2.3 线性表的链式存储 2.4 一元多项式的表示及相加.
第四章 时间序列的分析 本章教学目的:①了解从数量方面研究社会经济现象发展变化过程和发展趋势是统计分析的一种重要方法;②掌握时间数列编制的基本要求;③理解和掌握水平速度两方面指标的计算及运用④理解和掌握长期趋势分析和预测的方法。 本章教学重点:现象发展的水平指标和速度指标。 本章教学难点:现象变动的趋势分析。
邵阳文化.
契約 課程:文書實務與應用 教師:黃湃翔老師.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
第3章 栈和队列 3.1 栈 3.2 队列 3.3 应用.
單向鏈結串列 Singly Linked Lists.
第2章 线性表 线性结构 是一个数据元素的有序集合。.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
佇列 (Queue).
佇列與推疊 (Queue and Stack)
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
資料結構 第5章 佇列.
Chap 3 堆疊與佇列 Stack and Queue.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第12章 樹狀搜尋結構 (Search Trees)
第十五章 Linked List, Stack and Queue
單元3:軟體設計 3-1實體關係圖 Ch 08 System models.
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
计算机网络讲义 第5章 批量数据处理—数组 一维数组 排序和查找 二维数组 字符串.
奢侈稅成效分析與房市未來發展 吳中書 中華經濟研究院 第十九屆亞太財務經濟會計及管理會議 ~07.09.
變數命名 保留字(Reserved Word)
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第 3 讲 线性表(一).
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
内容回顾 线性表的定义和特点 线性表的顺序存储及查找、插入和删除.
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
佇列(queue) Lai Ah Fur.
第三章 栈和队列.
#define STACK_INIT_SIZE 10
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Chapter6 队列(Queues) The Abstract Data Type
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
程式結構&語法.
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
Linked Lists Prof. Michael Tsai 2013/3/12.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
第 六 讲 栈和队列(一).
◆ 第3節 基音與泛音 一、縱波的駐波 二、開管樂器的駐波 三、閉管樂器的駐波 四、共鳴空氣柱實驗 範例 1 範例 2 範例 3 範例 4
本节内容 1.二叉排序树的定义 2.二叉排序树的查找操作 3.二叉排序树的插入操作 4.二叉排序树的删除操作 5.二叉排序树的总结
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
Presentation transcript:

Chapter 2 Entity-Relationship Model 2019/8/1 2.4 特殊的线性表----队列 队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表。 空队列:不含任何数据元素的队列。 队尾和队首:允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队首。 出队 出队 出队 出队 出队 入队 入队 入队 a1 a2 a3 队首 队首 队尾 队列的操作特性:先进先出 队列的操作: MakeNull(Q)、Front(Q)、EnQueue(x, Q)、DeQueue(Q)、Empty(Q) 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.1 队列的指针实现 队列的链接存储结构及实现 链队列:队列的链接存储结构 如何改造单链表实现队列的链接存储? 队首指针即为链表的头结点指针 增加一个指向队尾结点的指针 head a1 a2 an ∧ front rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.1 队列的指针实现(Cont.) 队列的链接存储结构及实现 非空队列: 空队列: front a1 a2 an ∧ rear front ∧ rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.1 队列的指针实现(Cont.) 队列的链接存储结构及实现 存储结构定义 //结点的类型: struct celltype { ElemType data; celltype *next ; } ; 队列的 类型: struct QUEUE { celltype *front ; celltype *rear ; }; front a1 a2 an ∧ rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.1 队列的指针实现(Cont.) 队列的链接存储结构及实现 操作的实现----初始化和判空 ① void MakeNull( QUEUE &Q ) { Q.front = new celltype ; Q.front→next = NULL ; Q.rear = Q.front ; } ② Boolean Empty(QUEUE &Q) { if ( Q.front == Q.rear ) return TRUE ; else return FALSE ; } front ∧ rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.1 队列的指针实现(Cont.) 队列的链接存储结构及实现 操作的实现----入队 front a1 an ∧ x q ∧ ③ void EnQueue(ElemType x, QUEUE &Q) { q=new cwlltype; q->data=x ; q->next=NULL; Q.rear->next=q; Q.rear=q; } rear rear front ∧ x q ∧ rear rear 如何没有头结点会怎样? 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.1 队列的指针实现(Cont.) 队列的链接存储结构及实现 操作的实现---出队 p front a1 a2 an ∧ rear void DeQueue(QUEUE &Q ) { if (Q.rear==Q.front) cout<<“队空"; p=Q.front->next; Q.front->next=p->next; if (p->next==NULL) Q.rear=Q.front; delete p; } p front ∧ a1 ∧ rear rear 考虑边界情况:队列中只有一个元素? 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.2 队列的指针实现(Cont.) 队列的链接存储结构及实现 操作的实现---返回队首元素 front a1 a2 an ∧ rear ③ ElemType Front ( QUEUE Q ) { if ( Q.front→next ) return Q.front→next→ data ; } front a1 ∧ rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现 队列的数组存储结构及实现 如何改造数组实现队列的顺序存储? a1a2a3a4依次入队 0 1 2 3 4 入队 出队 a1 a2 a3 a4 rear rear rear rear 入队操作时间性能为O(1) 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何改造数组实现队列的顺序存储? a1a2依次出队 0 1 2 3 4 入队 出队 a1 a2 a3 a4 rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何改造数组实现队列的顺序存储? a1a2依次出队 0 1 2 3 4 入队 出队 a2 a3 a4 rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何改造数组实现队列的顺序存储? a1a2依次出队 0 1 2 3 4 入队 出队 a3 a4 rear 出队操作时间性能为O(n) 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何改进出队的时间性能? 所有元素不必存储在数组的前n个单元; 只要求队列的元素存储在数组中连续单元; 设置队头、队尾两个指针. 例: a1a2a3a4依次入队 0 1 2 3 4 入队 出队 a1 a2 a3 a4 front rear rear rear rear rear 入队操作时间性能仍为O(1) 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何改进出队的时间性能? a1a2依次出队 0 1 2 3 4 入队 出队 a1 a2 a3 a4 front front front rear 入队操作时间性能提高为O(1) 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 队列的移动有什么特点? 继续入队会出现什么情况? 假溢出: 当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,但此时数组的低端还有空闲空间,这种现象叫做假溢出。 0 1 2 3 4 入队 出队 a3 a4 a5 front rear rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何避免假溢出? 循环数组:将数组最后一个单元的下一个单元看成是0号单元,即把数组头尾相接----按模加一。 循环队列:用循环数组表示的队列。 0 1 2 3 4 出队 入队 a6 a3 a4 a5 rear front rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何判断循环队列队空和队满? 队空时,front和rear的相对位置 0 1 2 3 4 出队 入队 a3 front rear 0 1 2 3 4 出队 入队 a3 front front rear 队空:front==rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何判断循环队列队空和队满? 队满时,front和rear的相对位置 0 1 2 3 4 出队 入队 a6 a3 a4 a5 rear front 0 1 2 3 4 出队 入队 a6 a7 a3 a4 a5 rear rear front 队满:front==rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 如何区分队空、队满的判定条件? 方法一:增设一个存储队列中元素个数的计数器count,当front==rear 且count==0时,队空;当front==rear 且count==MaxSize时,队满; 方法二:设置标志flag,当front==rear且flag==0时为队空;当front==rear且flag==1时为队满。 方法三:保留队空的判定条件:front==rear;把队满判定条件修改为: ( (rear+1)%MaxSize==front) 。 代价:浪费一个元素空间,队满时数组中有一个空闲单元; 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 存储结构的定义 struct QUEUE { ElemType data [ MaxSize ] ; int front ; int rear ; }; //队列的类型 0 1 2 3 4 出队 入队 a6 a3 a4 a5 rear front 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 操作的实现---- ①队列初始化 void MakeNull ( QUEUE &Q) { Q.front = MaxSize-1; Q.rear = MaxSize-1; } 出队 0 1 2 3 4 入队 front rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 操作的实现---- ②队列判空 bool Empty( QUEUE Q ) { if ( Q.rear == Q.front ) return TRUE ; else return FALSE ; } 0 1 2 3 4 出队 入队 front rear 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 操作的实现---- ③返回队首元素 ElemType Front( QUEUE Q ) { if ( Empty( Q ) ) return NULLESE ; else { return (Q.data[(Q.front+1)%MaxSize] ); } 0 1 2 3 4 入队 出队 a6 a3 a4 a5 rear front 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 操作的实现---- ④入队 void EnQueue ( ElemType x, QUEUE &Q ) { if ( (Q.rear+1)%MaxSize ==Q.front ) cout<< “队列满”; else{ Q.rear=(Q.rear+1)%MaxSize ; Q.data[ Q.rear ] = x ; } 0 1 2 3 4 出队 a6 入队 a3 a4 a5 rear front 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.3 队列的数组实现(Cont.) 队列的数组存储结构及实现 操作的实现---- ⑤出队 void DeQueue ( QUEUE Q ) ; { if ( Empty ( Q ) ) cout<< “空队列” <<endl; else Q.front = (Q.front+1)%MaxSize ; } 0 1 2 3 4 出队 入队 a6 a3 a4 a5 rear front front 2019/8/1

Chapter 2 Entity-Relationship Model 2019/8/1 2.4.4 队列的应用 队列使用的原则 凡是符合先进先出原则的 服务窗口和排号机、打印机的缓冲区、分时系统、树型结构的层次遍历、图的广度优先搜索等等 举例 约瑟夫出圈问题:n个人排成一圈,从第一个开始报数,报到m的人出圈,剩下的人继续开始从1报数,直到所有的人都出圈为止。 舞伴问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写算法模拟上述舞伴配对问题。 2019/8/1