Chapter 6 队列(QUEUES).

Slides:



Advertisements
Similar presentations
動畫與遊戲設計 Data structure and artificial intelligent
Advertisements

Memory Pool ACM Yanqing Peng.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
Data Abstraction: The Walls
Chapter 3: Stack.
Chapter 7 Search.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
其他类型的链表主要内容 静态链表 循环链表 双向链表.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
Chapter3 Data Representation
佇列 (Queue).
佇列與推疊 (Queue and Stack)
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
資料結構 第5章 佇列.
Chapter8 Binary and Other Trees
Chap 3 堆疊與佇列 Stack and Queue.
Chapter 6 Graph Chang Chi-Chung
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
類別樣板 Class Template 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體(instance)
第十五章 Linked List, Stack and Queue
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
堆栈 (STACKS)—Restricted version of a linear list
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第 六 章 鏈結串列(Link List) 課程名稱:資料結構 授課老師:________ 2019/1/2.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
Chapter 3 Data Representation
佇列(queue) Lai Ah Fur.
二叉树和其他树 (Binary and other trees)
第三章 栈和队列.
MORE THAN TEMPLATE 工作总结 / 述职汇报 / 论文答辩 / 产品介绍.
資料結構 第4章 堆疊.
Chapter12 Graphs Definitions Applications Properties
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
樹 2 Michael Tsai 2013/3/26.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
感謝同學們在加分題建議. 我會好好研讀+反省~
Chapter6 队列(Queues) The Abstract Data Type
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
Chapter 5 Recursion.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
第三章 栈和队列 第二部分 队列(Queue) 2019/4/8.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
潘爱民 C++ Overview 潘爱民
顺序表的删除.
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.
队列及其实现.
软件测试技术-白盒测试 张志强 2006.
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
Inheritance -II.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
第二章 Java语法基础.
计算机问题求解 – 论题1-5 - 数据与数据结构 2018年10月16日.
Create and Use the Authorization Objects in ABAP
第六章 类属B树索引技术 对基于树的索引方法给出一种通用算法。该算法是建立在类属B树的概念之上开发的。它将类型系统开放,使系统能支持用户自定义的数据类型、函数和某些特殊的查询谓词的集合。并且,将新的数据类型、函数、查询谓词等登记到数据库管理系统中,
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
怎樣把同一評估 給與在不同班級的學生 How to administer the Same assessment to students from Different classes and groups.
第2章 Java语言基础.
Chapter 2 Entity-Relationship Model
Presentation transcript:

Chapter 6 队列(QUEUES)

contents 6.1 The abstract data type 6.2 formula-based representation 6.3 linked representation 6.4 applications

Bird’s eye view A queue is a special kind of linear list, i.e., insertion and deletions take place from different end, which is a first-in-first-out (FIFO) list. Although queue classes may be easily derived from the linear list class, for the run time efficiency, we only discuss it as a new linear list class.

6.1 抽象数据类型 定义: e1, e2, e3, …, ei, …, en-1, en 队列(queue)是一个线性表,其插入和删除操作分别在表的不同端进行。 添加新元素的那一端被称为队尾(rear). 删除元素的那一端被成为队首(front). e1, e2, e3, …, ei, …, en-1, en ↑ ↑ front rear

Dynamically change ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ C D E front rear A B C D front rear ↑ ↑ front rear A B C D ↑ ↑ front rear A B C D E ↑ ↑ front rear B C D E ↑ ↑ front rear insert delete 队列是一个先进先出( first-in-first-out, FIFO)的线性表。

Abstract data type abstractDataType Queue { instance ordered list of elements,one end is called front,the another is the rear; operations; Create (): 创建一个空的队列; IsEmpty (): 如果队列为空,则返回true,否则返回false; IsFull ( ) :如果队列满,则返回true;否则返回false; First (): 返回队列的第一个元素; Last ( ) :返回队列的最后一个元素; Add (x): 向队列中添加元素x; // enqueue Delete (x): 删除队首元素,并送入x ; // dequeue }

6.2 Formula-based representation e1 e2 e3 …… en queue 0 1 2 MaxSize-1 front rear formula: (using one dimension array) location(i) = i – 1 第一个元素: queue[0], 第二个元素 : queue[1] …… front总是为0 , rear始终是最后一个元素的位置

公式化描述 queue[0..rear-1]← queue[1..rear]; rear=rear-1; e1 e2 e3 …… en queue 0 1 2 MaxSize-1 front rear 队列的长度: rear + 1 空队列 : rear=-1 Add(x): rear=rear+1;queue[rear]=x; O(1) Delete(x): x=queue[0]; queue[0..rear-1]← queue[1..rear]; rear=rear-1; Q(n)

Front point is moving 公式: location(i) = location(1) + i – 1 front = location(1), rear = location(last element) 空队列 : rear < front Delete(x): x=queue(front) ;front++; Q(1) Add(x): when rear < Maxsize –1: rear=rear+1;queue[rear]=x; Q(1) when rear = Maxsize-1 and front > 0 ?

Shifting a queue when rear meet end when rear = Maxsize-1 and front > 0 Add(x)? 队列的移位之前 队列的移位之后 平移队列 queue[0..rear-front+1]← queue[front..rear]; rear=rear+1;queue[rear]=x; 时间复杂性 : Q(n)

Circular queue (循环存放) a b c d queue 0 1 2 MaxSize-1 front rear the worst case add and delete time become O(1) when following formula is used location(i) = (location(1) + i – 1) % Maxsize

Circular queue 描述队列的数组 描述队列的数组被视为一个环

循环队列(重要约定) front: 指向队列首元素前一个位置(逆时针方向)。 rear: 最后queue最后元素的位置。 rear

Circular queue Question: when front=rear the queue is full or empty? Solution: consider the queue is full when front=(rear+1) % MaxSize and empty if front == rear

template<class T> // 一维数组实现 class Queue { public: Queue(int MaxQueueSize = 10); ~Queue() {delete [] queue;} bool IsEmpty() const {return front = = rear;} bool IsFull() const {return (((rear + 1) % MaxSize = = front) ? 1 : 0);} T First() const; //返回队首元素 T Last() const; // 返回队尾元素 Queue<T>& Add(const T& x); Queue<T>& Delete(T& x); private: int front; //与第一个元素在反时针方向上相差一个位置 int rear; // 指向最后一个元素 int MaxSize; // 队列数组的大小 T *queue; // 数组 } ;

Constructor function template<class T> Queue<T>::Queue(int MaxQueueSize) {// 创建一个容量为MaxQueueSize的空队列 MaxSize = MaxQueueSize + 1; queue = new T[MaxSize]; front = rear = 0; }

‘First’ and ‘Last’ template<class T> T Queue<T>::First() const {// 返回队列的第一个元素 if (IsEmpty()) throw OutOfBounds(); return queue[(front + 1) % MaxSize]; } T Queue<T>::Last() const {// 返回队列的最后一个元素 return queue[rear];

操作 ‘Add’ template<class T> Queue<T>& Queue<T>::Add(const T& x) {// 把x 添加到队列的尾部 if (IsFull()) throw NoMem(); rear = (rear + 1) % MaxSize; queue[rear] = x; return *this; }

操作 ‘Delete’ template<class T> Queue<T>& Queue<T>::Delete(T& x) {// 删除第一个元素,并将其送入x if (IsEmpty()) throw OutOfBounds(); front = (front + 1) % MaxSize; x = queue[front]; return *this; }

6.4 linked representation A Queue is represented as a chain …… Using front and rear to track two ends of queue 表头为 front ,表尾为 rear 表头为 rear ,表尾为 front

链表描述 图6-7 链接队列 Head Tail Head Tail

向链表队列中添加元素 图 6-8 (a)的时间复杂性 O(1) 图 6-8 (b) 的时间复杂性 O(1) 图 6-8 (a) 向图 6-7 (a)中插入元素 图 6-8 (b) 向图 6-7 (b)中插入元素 图 6-8 (a)的时间复杂性 O(1) 图 6-8 (b) 的时间复杂性 O(1)

 从链表队列中删除元素 图 6-9 (a)的时间复杂性 O(1) 图 6-9 (b) 的时间复杂性O(n) 图 6-9 (a) 从图 6-7 (a)中删除元素  图 6-9 (b) 从图 6-7 (b)中删除元素 图 6-9 (a)的时间复杂性 O(1) 图 6-9 (b) 的时间复杂性O(n)

Using presentation front-to-rear  implementation Define LinkedQueue as base class Front = rear = 0 at beginning Front = 0 iff the queue is empty. queue is full iff there is no memory storage

template<class T> class LinkedQueue { //基类 public: LinkedQueue() {front = rear = 0;} ~LinkedQueue(); bool IsEmpty() const {return ((front) ? false : true);} bool IsFull() const; T First() const; // 返回第一个元素 T Last() const; // 返回最后一个元素 LinkedQueue<T>& Add(const T& x); LinkedQueue<T>& Delete(T& x); private: Node<T> *front; Node<T> *rear; } ;

template<class T> LinkedQueue<T>::~LinkedQueue( ) {Node<T> *next; while (front) { next = front->link; delete front; front = next; } bool LinkedQueue<T>::IsFull( ) const // 是否有可利用空间 {Node<T> *p; try {p = new Node<T>; delete p; return false;} catch (NoMem) {return true;}

template<class T> T LinkedQueue<T>::First() const { // 返回队列的第一个元素 if (IsEmpty()) throw OutOfBounds(); return front->data; } T LinkedQueue<T>::Last() const {// 返回队列的最后一个元素 return rear->data;

template<class T> LinkedQueue<T>& LinkedQueue<T>::Add(const T& x) {// 把x 添加到队列的尾部 // 不捕获可能由new引发的NoMem 异常 Node<T> *p = new Node<T>; // 为新元素创建链表节点 p->data = x; p->link = 0; // 在队列尾部添加新节点 if (front) rear->link = p; //队列不为空 else front = p; // 队列为空 rear = p; return *this; }

template<class T> LinkedQueue<T>& LinkedQueue<T>::Delete(T& x) {// 删除第一个元素,并将其放入x If (IsEmpty( )) throw OutOfBounds(); x = front->data; //保存第一个节点中的元素 Node<T> *p = front; front = front->link; // 删除第一个节点 delete p; return *this; }

6.4 应用 6.4.1 火车车厢重排 6.4.2 电路布线 6.4.3 图元识别 6.4.4 工厂仿真

6.4.1 火车车厢重排 缓冲铁轨位于入轨和出轨之间 禁止 : 铁轨Hk 为可直接将车厢从入轨移动到出轨的通道 将车厢从缓冲铁轨移动至入轨 从出轨移动车厢至缓冲铁轨 铁轨Hk 为可直接将车厢从入轨移动到出轨的通道

Track selection When a car to be moved to a holding track: Move car c to a holding track that contains only cars with a smaller label; if there are more than two such track, select the one with largest label at its left end; otherwise select an empty track (if one remains)

火车车厢重排 int NowOut=1; // NowOut:下一次要输出的车厢号 for (int i=1;i<=n;i++)//从前至后依次检查的所有车厢 {1. 车厢 p[i] 从入轨上移出 2. If (p[i] == NowOut)// NowOut:下一次要输出的车厢号 ①使用缓冲铁轨Hk把p[i]放到出轨上去; NowOut++; ② while (minH(当前缓冲铁轨中编号最小的车厢)== NowOut ) {把minH放到出轨上去; 更新 minH,minQ(minH所在的缓冲铁轨); NowOut++;} else 按照分配规则将车厢p[i]送入某个缓冲铁轨 } 读程序 6-7 6-8

作业 P193-194:1(1),4,P197:7,P217:17