本章的基本内容是: ⑴栈和队列的定义及操作特性; 第3章 特殊线性表—栈、队列和串 ⑵栈和队列的两种存储方法和基本运算的实现;

Slides:



Advertisements
Similar presentations
一、算法的基本概念 二、数据结构 三、栈和队列 四、排序方法 五、二叉树
Advertisements

人 工 智 慧 報 告 五子棋AI設計 報告者 : 潘輝銘.
问题的提出: 例1 把十进制整数转换为二至十六之间的任一进制数输出。
实用数据结构基础 第3章 栈.
第3章 栈和队列.
主要内容: 1.第一部分 概述 2.第二部分 线性表、栈、队列
第三章 栈和队列 Stack and Queue
第三章栈和队列 栈 队列 递归.
資料結構設計與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)
数据结构.
第十章 基本数据结构 链表结构 栈结构 队列结构 主讲:李祥 时间:2015年10月.
Chap 3 堆疊與佇列 Stack and Queue.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第3章 顺序存储结构的表、堆栈和队列 3.1 顺序存储结构 3.2 表和顺序表 3.3 堆栈和顺序堆栈 3.4 队列和顺序队列
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
本 章 说 明 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队 列 本 章 小 结 返回主目录.
第三章 栈和队列 栈和队列是两种重要的数据结构。
辅导课程六.
1、栈及其实现 2、栈的应用 3、队列及其实现 4、优先级队列 5、链式队列 6、队列应用
第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示.
Chapter 6 队列(QUEUES).
第3章 栈和队列(一).
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
五、链 表 1、单链表 2、双向链表 3、链表应用.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
第六章 数据抽象-类 胡昊 南京大学计算机系软件所.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
第3章 栈和队列 3.1 栈 本章主题:栈和队列的应用 教学目的:掌握栈和队列的应用方法,理解栈的重要作用
数 据 结 构 刘家芬 Sept 2012.
2010年计算机考研基础班讲义 数据结构基础 计算机考研小组(100).
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第三章 栈和队列.
資料結構 第4章 堆疊.
顺序表的插入.
数据结构概论 第3章 栈和队列 董黎刚 浙江工商大学信电学院 2019年2月25日.
第四章 栈和队列 4.1栈 4.2栈的应用 4.3队列 4.3队列应用.
计算机软件技术基础 数据结构与算法(3).
第五章 数组 5.1 数组的定义 5.2 数组的表示和实现* 5.3 数组的压缩.
第三章 栈和队列 第二部分 队列(Queue) 2019/4/8.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:中国网页设计
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
顺序表的删除.
数据结构习题课 信息学院 赵明 2005年秋.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
单链表的基本概念.
第 四 讲 线性表(二).
3.16 枚举算法及其程序实现 ——数组的作用.
第 六 讲 栈和队列(一).
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第一章 绪论 1.1 引言 1.2 逻辑结构和存储结构 1.3 算法.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
#include <iostream.h>
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第七讲 栈和队列(二) 1/.
第3章 栈和队列 3.1 栈 3.2 队列.
Chapter 2 Entity-Relationship Model
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
第二章 线性表 线性表是一种最简单的线性结构 线性结构是一个数据元素的有序(次序)集.
第三章 栈和队列.
昆山爱达人信息技术有限公司 QQ: 本节内容 1.栈的链式存储结构及实现 2.栈的应用.
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
Presentation transcript:

本章的基本内容是: ⑴栈和队列的定义及操作特性; 第3章 特殊线性表—栈、队列和串 ⑵栈和队列的两种存储方法和基本运算的实现; 第3章 特殊线性表—栈、队列和串 本章的基本内容是: ⑴栈和队列的定义及操作特性;  ⑵栈和队列的两种存储方法和基本运算的实现;  ⑶串的基本概念和操作;  ⑷串的常用存储方法;  ⑸串的模式匹配算法。

第3章 特殊线性表——栈 3.1.1 栈的逻辑结构 1. 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。 第3章 特殊线性表——栈 3.1.1 栈的逻辑结构 1. 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶,另一端称为栈底; 处于栈顶位置的数据元素称为栈顶元素; 不含任何数据元素的栈称为空栈。

a3 a2 a1 第3章 特殊线性表——栈 栈的示意图 栈的特性:后进先出 1.举一些生活中的例子。 第3章 特殊线性表——栈 栈的示意图 1.举一些生活中的例子。 出栈 2.假定有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种? 入栈 栈顶 a3 注意:栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。 a2 a1 栈底 栈的特性:后进先出

第3章 特殊线性表——栈 2. 栈的抽象数据类型定义 栈的基本操作: ⑴ Initial ( S ):构造一个空栈S。 第3章 特殊线性表——栈 2. 栈的抽象数据类型定义 栈的基本操作: ⑴ Initial ( S ):构造一个空栈S。 ⑵ Empty ( S ):判断栈S是否为空栈。 ⑶ Push (S, x):在栈S的顶部插入一个新元素x。 ⑷ Pop ( S ):将栈S的顶部元素从栈中删除。 ⑸ GetTop ( S ):取出栈顶元素。

第3章 特殊线性表——栈 3.1.2 栈的顺序存储结构及实现 a1 a2 top 出栈:top减1 top top 1. 顺序栈 第3章 特殊线性表——栈 3.1.2 栈的顺序存储结构及实现 1. 顺序栈 栈的顺序存储结构称为顺序栈 。 如何改造数组实现栈的顺序存储? 0 1 2 3 4 5 6 7 8 a1 a2 top 出栈:top减1 栈空:top= -1 top top 进栈:top加1 确定是用数组的哪一端表示栈底,同时附设指针top指示栈顶元素在数组中的位置即可。

第3章 特殊线性表——栈 2. 顺序栈的实现 顺序栈类的声明 const int MAX_SIZE=100; 第3章 特殊线性表——栈 2. 顺序栈的实现 const int MAX_SIZE=100; template <class T> class seqStack { public: seqStack ( ) ; ~seqStack ( ); void Push ( T x ); T Pop ( ); T GetTop ( ); bool Empty ( ); private: T data[MAX_SIZE]; int top; } 顺序栈类的声明

第3章 特殊线性表——栈 顺序栈的基本运算的实现——入栈 template <class T> 第3章 特殊线性表——栈 顺序栈的基本运算的实现——入栈 template <class T> void seqStack::Push ( T x) { if (top==MAX_SIZE-1) throw “溢出”; top++; data[top]=x; } 时间复杂度?

第3章 特殊线性表——栈 顺序栈的基本运算的实现——出栈 template <class T> 第3章 特殊线性表——栈 顺序栈的基本运算的实现——出栈 template <class T> T seqStack:: Pop ( ) { if (top==-1) throw “溢出”; x=data[top--]; return x; } 时间复杂度?

第3章 特殊线性表——栈 3. 两栈共享空间 提出问题:在一个程序中需要同时使用具有相同数据类型的两个栈。 解决方案① 第3章 特殊线性表——栈 3. 两栈共享空间 提出问题:在一个程序中需要同时使用具有相同数据类型的两个栈。 解决方案① 直接解决:为每个栈开辟一个数组空间。 分析会出现什么问题?如何解决? 解决方案② 利用顺序栈单向延伸的特性,使用一个数组来存储两个栈。 分析会出现什么问题?如何解决?

第3章 特殊线性表——栈 存储空间的浪费。 解决方案二: 第3章 特殊线性表——栈 使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,每个栈从各自的端点向中间延伸。 解决方案一:为每个栈开辟一个数组空间。 存储空间的浪费。 解决方案二:

第3章 特殊线性表——栈 两栈共享空间示意图 其中:top1和top2分别为栈1和栈2的栈顶指针; 第3章 特殊线性表——栈 两栈共享空间示意图 a1 a2 …… ai bj …… b2 b1 栈1底 top1 top2 栈2底 Stake_Size-1 其中:top1和top2分别为栈1和栈2的栈顶指针; Stack_Size为整个数组空间的大小; 栈1的底固定在下标为0的一端; 栈2的底固定在下标为StackSize-1的一端。

第3章 特殊线性表——栈 两栈共享空间类的声明 const int StackSize=100; 第3章 特殊线性表——栈 const int StackSize=100; template <class T> class BothStack { public: BothStack( ) {top1= -1; top2=StackSize;} ~BothStack( ) { } void Push(int i, T x); T Pop(int i); T GetTop(int i); bool Empty(int i); private: T data[StackSize]; int top1, top2; }; 两栈共享空间类的声明

第3章 特殊线性表——栈 问题一:什么时候栈1空? 问题二:什么时候栈2空? top1=top2-1 问题三:什么时候栈满? 第3章 特殊线性表——栈 top1=-1 问题一:什么时候栈1空? top2=StackSize 问题二:什么时候栈2空? top1=top2-1 问题三:什么时候栈满? 设i表示整型数值,它只取1和2,当i=1时,表示对栈1操作,当i=2时表示对栈2操作; 当新元素压入栈2时,栈顶指针top2减1;当从栈2删除元素时,top2加1。

第3章 特殊线性表——栈 在栈i中插入元素x的算法用伪代码描述为: 1. 如果栈满,则抛出上溢异常; 2. 判断是插在栈1还是栈2; 第3章 特殊线性表——栈 在栈i中插入元素x的算法用伪代码描述为: 1. 如果栈满,则抛出上溢异常; 2. 判断是插在栈1还是栈2; 2.1 若是在栈1插入,则栈顶指针top1加1,在top1处填入x; 2.2 若是在栈2插入,则栈顶指针top2减1,在top2处填入x;

第3章 特殊线性表——栈 在栈i中删除栈顶元素的算法用伪代码描述为: 1. 判断是在栈1删除还是在栈2删除。 2. 若是在栈1删除,则 第3章 特殊线性表——栈 在栈i中删除栈顶元素的算法用伪代码描述为: 1. 判断是在栈1删除还是在栈2删除。 2. 若是在栈1删除,则 2.1 若栈1为空栈,抛出下溢异常; 2.2 删除并返回栈1的栈顶元素; 3. 若是在栈2删除,则 3.1 若栈2为空栈,抛出下溢异常; 3.2 删除并返回栈2的栈顶元素;

第3章 特殊线性表——栈 3.1.3 栈的链接存储结构及实现 an an-1 a1 ∧ 1.链栈定义 栈的链接存储结构称为链栈 。 栈顶 第3章 特殊线性表——栈 3.1.3 栈的链接存储结构及实现 1.链栈定义 栈的链接存储结构称为链栈 。 an-1 an a1 ∧ 栈顶 栈底 top 链栈示意图 链栈是否也需要加一个头结点?

第3章 特殊线性表——栈 2. 链栈的实现 链栈的类的声明 template <class T> class LinkStack 第3章 特殊线性表——栈 2. 链栈的实现 template <class T> class LinkStack { public: LinkStack( ) {top=NULL;} ~LinkStack( ); void Push(T x); T Pop( ); T GetTop( ) {if (top!=NULL) return top->data;} bool Empty( ) {top==NULL? return 1: return 0;} private: Node<T> *top; } 链栈的类的声明

第3章 特殊线性表——栈 链栈的插入操作 链栈插入算法 s x template <class T> 第3章 特殊线性表——栈 链栈的插入操作 template <class T> void LinkStack::Push(T x) { s=new Node<T>; s->data=x; s->next=top; top=s; } 链栈插入算法 ② top x s ① ai a1 ∧ top

第3章 特殊线性表——栈 p top ai top ai-1 a1 ∧ 链栈的删除操作 链栈的删除算法 第3章 特殊线性表——栈 链栈的删除操作 template <class T> T LinkStack::Pop( ) { if (top==NULL) throw "下溢"; x=top->data; p=top; top=top->next; delete p; return x; } 链栈的删除算法 p ai-1 ai a1 ∧ top top

第3章 特殊线性表——栈 3.1.4 顺序栈和链栈的比较 时间性能相同。都是常数时间。 第3章 特殊线性表——栈 3.1.4 顺序栈和链栈的比较 时间性能相同。都是常数时间。 空间性能方面。初始时顺序栈必须确定一个固定的长度,所以有存储元素个数的限制和空间浪费的问题。链栈没有栈满的问题,只有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销。所以当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈