第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.

Slides:



Advertisements
Similar presentations
人 工 智 慧 報 告 五子棋AI設計 報告者 : 潘輝銘.
Advertisements

動畫與遊戲設計 Data structure and artificial intelligent
第二次直播 清华大学 殷人昆 中央电大 徐孝凯.
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
第7单元 面向过程编程—— 继承与多态.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
第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.
第八章 图 图的基本概念 图的存储结构 图的遍历与连通性 最小生成树 最短路径 活动网络.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
哈夫曼编码.
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
第十五章 Linked List, Stack and Queue
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
程序设计期末复习 黎金宁
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
堆疊 Stack chapter 4 德明科技大學資訊科技系.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
数据结构与算法
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
佇列(queue) Lai Ah Fur.
二叉树和其他树 (Binary and other trees)
第三章 栈和队列.
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Chapter6 队列(Queues) The Abstract Data Type
Tree & Binary Tree.
二叉树的遍历.
自我參考結構 (self-reference – 1)
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第二章 数组 作为抽象数据类型的数组 顺序表 多项式抽象数据类型 稀疏矩阵 字符串 小结.
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.
队列及其实现.
Chap2 Stack & Queue.
第三章 数据抽象.
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
1. 志明打算就客戶服務開發一個語音互動(IVR)系統, 顧客可透過電話鍵盤與系統進行互動。
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
Chapter 2 Entity-Relationship Model
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结

栈 ( Stack ) 只允许在一端插入和删除的顺序表 允许插入和删除 的一端称为栈顶 (top),另一端称 为栈底(bottom) 特点 后进先出 (LIFO)

栈的抽象数据类型 template <class Type> class Stack { public: Stack ( int=10 ); //构造函数 void Push ( const Type & item); //进栈 Type Pop ( ); //出栈 Type GetTop ( ); //取栈顶元素 void MakeEmpty ( ); //置空栈 int IsEmpty ( ) const; //判栈空否 int IsFull ( ) const; //判栈满否 }

栈的数组表示 — 顺序栈 #include <assert.h> template <class Type> class Stack { public: Stack ( int=10 ); //构造函数 ~Stack ( ) { delete [ ] elements; } //析构函数 void Push ( const Type & item ); //进栈 Type Pop ( ); //出栈 Type GetTop ( ); //取栈顶 void MakeEmpty ( ) { top = -1; } //置空栈 int IsEmpty ( ) const { return top == -1; }

int IsFull ( ) const { return top == maxSize-1; } private: int top; //栈顶数组指针 Type *elements; //栈数组 int maxSize; //栈最大容量 } template <class Type> Stack<Type>:: Stack ( int s ) : top (-1), maxSize (s) { elements = new Type[maxSize]; assert ( elements != 0 ); //断言

进栈示例

退栈示例

template <class Type> void Stack<Type>:: Push ( const Type & item ) { assert ( !IsFull ( ) ); //先决条件断言 elements[++top] = item; //加入新元素 } template <class Type> Type Stack<Type>:: Pop ( ) { assert ( !IsEmpty ( ) ); //先决条件断言 return elements[top--]; //退出栈顶元素

双栈共享一个栈空间 template <class Type> Type stack<Type>:: GetTop ( ) { assert ( !IsEmpty ( ) ); //先决条件断言 return elements[top]; //取出栈顶元素 } 双栈共享一个栈空间

多栈处理 栈浮动技术 n 个栈共享一个数组空间V[m] 设立栈顶指针数组 t [n+1] 和 栈底指针数组 b [n+1] t[i]和b[i]分别指示第 i 个栈的栈顶与栈底 b[n]作为控制量,指到数组最高下标 各栈初始分配空间 s = m / n 指针初始值 t[0] = b[0] = -1 b[n] = m-1 t[i] = b[i] = b[i-1] + s, i = 1, 2, …, n-1

插入新元素时的栈满处理 StackFull ( )

template <class Type> void Push ( const int i, const Type & item ) { if ( t [i] == b[i+1] ) StackFull (i); else V[++t[i]] = item; //第i 个栈进栈 } template <class Type> Type *Pop ( const i) { if ( t[i] == b[i] ) { StackEmpty(i); return 0; } else return & V[t[i]--]; //第i 个栈出栈

栈的链接表示 — 链式栈 链式栈无栈满问题,空间可扩充 插入与删除仅在栈顶处执行 链式栈的栈顶在链头 适合于多栈操作

链式栈 (LinkedStack)类的定义 template <class Type> class Stack; template <class Type> class StackNode { friend class Stack<Type>; private: Type data; //结点数据 StackNode<Type> *link; //结点链指针 StackNode ( Type d = 0, StackNode<Type> *l = NULL ) : data ( d ), link ( l ) { } };

template <class Type> class Stack { public: Stack ( ) : top ( NULL ) { } ~Stack ( ); void Push ( const Type & item); Type Pop ( ); Type GetTop ( ); void MakeEmpty ( ); //实现与~Stack( )同 int IsEmpty ( ) const { return top == NULL; } private: StackNode<Type> *top; //栈顶指针 }

template <class Type> Stack<Type>:: StackNode<Type> *p; while ( top != NULL ) //逐结点回收 { p = top; top = top→link; delete p; } } template <class Type> void Stack<Type>:: Push ( const Type &item ) { top = new StackNode<Type> ( item, top ); //新结点链入top之前, 并成为新栈顶

template <class Type> Type Stack<Type>:: Pop ( ) { assert ( !IsEmpty ( ) ); StackNode<Type> *p = top; Type retvalue = p→data; //暂存栈顶数据 top = top→link; //修改栈顶指针 delete p; return retvalue; //释放,返回数据 } GetTop ( ) { return top→data;

队列 ( Queue ) 定义 特性 队列是只允许在一端删除,在另一端插入的顺序表 允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。 特性 先进先出(FIFO, First In First Out)

队列的抽象数据类型 template <class Type> class Queue { public: Queue ( int=10 ); //构造函数 void EnQueue ( const Type & item); //进队 Type DeQueue ( ); //出队列 Type GetFront ( ); //取队头元素值 void MakeEmpty ( ); //置空队列 int IsEmpty ( ) const ; //判队列空否 int IsFull ( ) const; //判队列满否 }

队列的数组表示  循环队列的类定义 #include <assert.h> 队列的数组表示  循环队列的类定义 #include <assert.h> template <class Type> class Queue { public: Queue ( int=10 ); ~Queue ( ) { delete [ ] elements; } void EnQueue ( const Type & item); Type DeQueue ( ); Type GetFront ( ); void MakeEmpty ( ) { front = rear = 0; }

int IsEmpty ( ) const { return front == rear; } int IsFull ( ) const { return (rear+1) % maxSize == front; } int Length ( ) const { return (rear-front+maxSize) % maxSize;} private: int rear, front; Type *elements; int maxSize; }

队列的进队和出队 进队时队尾指针先进一 rear = rear + 1,再将 新元素按 rear 指示位置加入。 出队时队头指针先进一 front = front + 1,再 将下标为 front 的元素取出。 队满时再进队将溢出出错;队空时再出队将 队空处理。

循环队列 (Circular Queue) 存储队列的数组被当作首尾相接的表处理。 队头、队尾指针加1时从maxSize -1直接进到0,可用语言的取模(余数)运算实现。 队头指针进1: front = (front + 1) % maxSize; 队尾指针进1: rear = (rear + 1) % maxSize; 队列初始化:front = rear = 0; 队空条件:front == rear; 队满条件:(rear + 1) % maxSize == front

循环队列的进队和出队

循环队列部分成员函数的实现 template <class Type> Queue<Type>:: Queue ( int sz ) : front (0), rear (0), maxSize (sz) { elements = new Type[maxSize]; assert ( elements != 0 ); } template <class Type> void Queue<Type>:: EnQueue ( const Type & item ) { assert ( !IsFull ( ) ); rear = (rear+1) % MaxSize; elements[rear] = item;

template <class Type> Type Queue<Type>::DeQueue ( ) { assert ( !IsEmpty ( ) ); front = ( front+1) % MaxSize; return elements[front]; } Type Queue<Type>::GetFront ( ) {

队列的链接表示 — 链式队列 队头在链头,队尾在链尾。 链式队列在进队时无队满问题,但有队空问题。 队空条件为 front == NULL

链式队列类的定义 template <class Type> class Queue; template <class Type> class QueueNode { friend class Queue<Type>; private: Type data; //队列结点数据 QueueNode<Type> *link; //结点链指针 QueueNode ( Type d=0, QueueNode *l=NULL ) : data (d), link (l) { } };

template <class Type> class Queue { public: Queue ( ) : rear ( NULL ), front ( NULL ) { } ~Queue ( ); void EnQueue ( const Type & item ); Type DeQueue ( ); Type GetFront ( ); void MakeEmpty ( ); //实现与~Queue( )同 int IsEmpty ( ) const { return front == NULL; } private: QueueNode<Type> *front, *rear; //队列指针 };

链式队列成员函数的实现 template <class Type> Queue<Type>::~Queue ( ) { //队列的析构函数 QueueNode<Type> *p; while ( front != NULL ) { //逐个结点释放 p = front; front = front→link; delete p; }

template <class Type> void Queue<Type>:: EnQueue ( const Type & item ) { if ( front == NULL ) //空, 创建第一个结点 front = rear = new QueueNode <Type> ( item, NULL ); else //队列不空, 插入 rear = rear→link = new QueueNode }

template <class Type> Type Queue<Type>::DeQueue ( ) { //删去队头结点,并返回队头元素的值 assert ( !IsEmpty ( ) ); //判队空的断言 QueueNode<Type> *p = front; Type retvalue = p→data; //保存队头的值 front = front→link; //新队头 delete p; return retvalue; }

template <class Type> Type Queue<Type>::GetFront ( ) { //若队不空,则函数返回队头元素的值; 若 //队空,则函数返回0。 assert ( !IsEmpty ( ) ); return front→data; }

队列的应用举例 — 逐行打印二项展开式 (a + b)i 的系数 杨辉三角形 (Pascal’s triangle)

分析第 i 行元素与第 i+1行元素的关系 目的是从前一行的数据可以计算下一行的数据

从第 i 行数据计算并存放第 i+1 行数据

利用队列打印二项展开式系数的程序 #include <stdio.h> #include <iostream.h> #include "queue.h" void YANGVI ( int n ) { Queue q; //队列初始化 q.MakeEmpty ( ); q.EnQueue (1); q.EnQueue (1); int s = 0;

for ( int i=1; i<=n; i++ ) { //逐行计算 cout << endl; q.EnQueue (0); for ( int j=1; j<=i+2; j++ ) { //下一行 int t = q.DeQueue ( ); q.EnQueue ( s+t ); s = t; if ( j != i+2 ) cout << s << ' '; }

优先级队列 (Priority Queue) 优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素 例如下表:任务的优先权及执行顺序的关系 数字越小,优先权越高

优先队列的类定义 #include <assert.h> #include <iostream.h> $include <stdlib.h> const int maxPQSize = 50; //缺省元素个数 template <class Type> class PQueue { public: PQueue ( ); ~PQueue ( ) { delete [ ] pqelements; } void PQInsert ( const Type & item ); Type PQRemove ( );

void makeEmpty ( ) { count = 0; } int IsEmpty ( ) const { return count == 0; } int IsFull ( ) const { return count == maxPQSize; } int Length ( ) const { return count; } private: Type *pqelements; //存放数组 int count; //队列元素计数 }

优先队列部分成员函数的实现 template <class Type> PQueue<Type>::PQueue ( ) : count (0) { pqelements = new Type[maxPQSize]; assert ( pqelements != 0 ); //分配断言 } template <class Type> void PQueue<Type> :: PQInsert ( const Type & item ) { assert ( !IsFull ( ) ); //判队满断言 pqelements[count] = item; count ++;

template <class Type> Type PQueue<Type>::PQRemove ( ) { assert ( !IsEmpty ( ) ); //判队空断言 Type min = pqelements[0]; int minindex = 0; for ( int i=1; i<count; i++ ) //寻找最小元素 if ( pqelements[i] < min ) //存于min { min = pqelements[i]; minindex = i; } pqelements[minindex] = pqelements[count-1]; count-- ; //删除 return min; }

小结 需要复习的知识点 栈 栈的抽象数据类型 栈的数组存储表示 栈的链接存储表示 栈的应用: 用后缀表达式求值;中缀表达式向后缀表达式转换 队列 队列的抽象数据类型

队列的链接存储表示 队列的应用:打印杨辉三角形 用循环队列实现双端队列的插入与删除算法 优先级队列 优先级队列的定义 队列的顺序存储表示 队列的链接存储表示 队列的应用:打印杨辉三角形 用循环队列实现双端队列的插入与删除算法 优先级队列 优先级队列的定义 优先级队列的链接存储表示 优先级队列的应用举例