已阅读5页,还剩68页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 3 章 栈和队列,本章的基本内容是:,两种特殊的线性表栈和队列,从数据结构角度看,栈和队列是操作受限的线性表,他们的逻辑结构相同。 从抽象数据类型角度看,栈和队列是两种重要的抽象数据类型。,3.1 栈,栈的逻辑结构,(a1, a2, , an),栈:限定仅在表的一端进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶,另一端称为栈底。 空栈:不含任何数据元素的栈。,a1,a2,a3,入栈,出栈,插入:入栈、进栈、压栈 删除:出栈、弹栈,3.1 栈,栈的逻辑结构,栈的操作特性:后进先出,a1,a2,a3,入栈,出栈,插入:入栈、进栈、压栈 删除:出栈、弹栈,3.1 栈,栈的逻辑结构,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,a,b,c,情况1:,栈的逻辑结构,3.1 栈,a,b,c,出栈序列:c,出栈序列:c、b,出栈序列:c、b、a,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,栈的逻辑结构,情况1:,3.1 栈,a,b,出栈序列:b,情况2:,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,栈的逻辑结构,3.1 栈,a,出栈序列:b,出栈序列:b、c,出栈序列: b、 c、a,c,注意:栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,栈的逻辑结构,情况2:,3.1 栈,栈的抽象数据类型定义,ADT Stack Data 栈中元素具有相同类型及后进先出特性, 相邻元素具有前驱和后继关系 Operation InitStack 前置条件:栈不存在 输入:无 功能:栈的初始化 输出:无 后置条件:构造一个空栈,3.1 栈,DestroyStack 前置条件:栈已存在 输入:无 功能:销毁栈 输出:无 后置条件:释放栈所占用的存储空间 Push 前置条件:栈已存在 输入:元素值x 功能:在栈顶插入一个元素x 输出:如果插入不成功,抛出异常 后置条件:如果插入成功,栈顶增加了一个元素,栈的抽象数据类型定义,3.1 栈,Pop 前置条件:栈已存在 输入:无 功能:删除栈顶元素 输出:如果删除成功,返回被删元素值,否则,抛出异常 后置条件:如果删除成功,栈减少了一个元素 GetTop 前置条件:栈已存在 输入:无 功能:读取当前的栈顶元素 输出:若栈不空,返回当前的栈顶元素值 后置条件:栈不变,栈的抽象数据类型定义,3.1 栈,Empty 前置条件:栈已存在 输入:无 功能:判断栈是否为空 输出:如果栈为空,返回1,否则,返回0 后置条件:栈不变 endADT,栈的抽象数据类型定义,3.1 栈,栈的顺序存储结构及实现,顺序栈栈的顺序存储结构,如何改造数组实现栈的顺序存储?,a1,确定用数组的哪一端表示栈底。,附设指针top指示栈顶元素在数组中的位置。,3.1 栈,出栈:top减1,进栈:top加1,栈空:top= -1,a1,a2,a3,栈满:top= MAX_SIZE-1,栈的顺序存储结构及实现,3.1 栈,顺序栈类的声明,const int MAX_SIZE=100; template class seqStack public: seqStack ( ) ; seqStack ( ); void Push ( DataType x ); DataType Pop ( ); DataType GetTop ( ); bool Empty ( ); private: DataType dataMAX_SIZE; int top; ,3.1 栈,顺序栈的实现入栈,template void seqStack :Push ( DataType x) if (top = MAX_SIZE-1) throw “溢出”; top+; datatop = x; ,操作接口: void Push( DataType x );,时间复杂度?,data+top = x,3.1 栈,顺序栈的实现出栈,template DataType seqStack : Pop ( ) if (top = -1) throw “溢出”; x = datatop-; return x; ,操作接口: DataType Pop( );,时间复杂度?,3.1 栈,两栈共享空间,解决方案2:,顺序栈单向延伸使用一个数组来存储两个栈,在一个程序中需要同时使用具有相同数据类型的两个栈,如何顺序存储这两个栈?,会出现什么问题?如何解决?,3.1 栈,两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从各自的端点向中间延伸。,两栈共享空间,3.1 栈,栈1的底固定在下标为0的一端; 栈2的底固定在下标为StackSize-1的一端。 top1和top2分别为栈1和栈2的栈顶指针; Stack_Size为整个数组空间的大小(图中用S表示);,a1 a2 ai,0 1 2 S-1,两栈共享空间,bj b2 b1,3.1 栈,top1= -1,什么时候栈1为空?,a1 a2 ai,0 1 2 S-1,两栈共享空间,bj b2 b1,3.1 栈,top1= -1,什么时候栈1为空?,a1 a2 ai,0 1 2 S-1,两栈共享空间,bj b2 b1,什么时候栈2为空?,top2= Stack_Size,3.1 栈,top1= -1,什么时候栈1为空?,a1 a2 ai,0 1 2 S-1,两栈共享空间,bj b2 b1,什么时候栈2为空?,top2= Stack_Size,什么时候栈满?,top2= top1+1,3.1 栈,const int Stack_Size=100; template class BothStack public: BothStack( ); BothStack( ); void Push(int i, DataType x); DataType Pop(int i); DataType GetTop(int i); bool Empty(int i); private: DataType dataStack_Size; int top1, top2; ;,两栈共享空间类的声明,3.1 栈,1. 如果栈满,则抛出上溢异常; 2. 判断是插在栈1还是栈2; 2.1 若在栈1插入,则 2.1.1 top1加1; 2.1.2 在top1处填入x; 2.2 若在栈2插入,则 2.2.1 top2减1; 2.2.2 在top2处填入x;,两栈共享空间的实现插入,操作接口:void Push(int i, DataType x) ;,3.1 栈,1. 若是在栈1删除,则 1.1 若栈1为空栈,抛出下溢异常; 1.2 删除并返回栈1的栈顶元素; 2. 若是在栈2删除,则 2.1 若栈2为空栈,抛出下溢异常; 2.2 删除并返回栈2的栈顶元素;,两栈共享空间的实现删除,操作接口:DataType Pop(int i) ;,3.1 栈,栈的链接存储结构及实现,链栈:栈的链接存储结构,链栈需要加头结点吗?,如何改造链表实现栈的链接存储?,将哪一端作为栈顶?,将链头作为栈顶,方便操作。,链栈不需要附设头结点。,3.1 栈,栈的链接存储结构及实现,栈顶,栈底,链栈:栈的链接存储结构,两种示意图在内存中对应同一种状态,启示?,栈顶,栈底,3.1 栈,链 栈 的 类 声 明,template class LinkStack public: LinkStack( ); LinkStack( ); void Push(DataType x); DataType Pop( ); DataType GetTop( ); bool Empty( ); private: Node *top; ,3.1 栈,template void LinkStack :Push(DataType x) s = new Node; s-data = x; s-next = top; top = s; ,an,an-1,a1,链栈的实现插入,操作接口: void Push(DataType x);,为什么没有判断栈满?,3.1 栈,template DataType LinkStack :Pop( ) if (top = NULL) throw “下溢“; x = top-data; p = top; top = top-next; delete p; return x; ,链栈的实现插入,操作接口: DataType Pop( );,an,an-1,a1,top+可以吗?,3.1 栈,顺序栈和链栈的比较,时间性能:相同,都是常数时间O(1)。,空间性能: 顺序栈:有元素个数的限制和空间浪费的问题。 链栈:没有栈满的问题,只有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销。,总之,当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈。,3.1 栈,3.2 队列,队列的逻辑结构,队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表。 允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头。 空队列:不含任何数据元素的队列。,(a1, a2, , an),队列的操作特性:先进先出,a1,a2,a3,入队,队尾,队头,出队,队头,队列的逻辑结构,3.2 队列,队列的抽象数据类型定义,ADT Queue Data 队列中元素具有相同类型及先进先出特性, 相邻元素具有前驱和后继关系 Operation InitQueue 前置条件:队列不存在 输入:无 功能:初始化队列 输出:无 后置条件:创建一个空队列,3.2 队列,DestroyQueue 前置条件:队列已存在 输入:无 功能:销毁队列 输出:无 后置条件:释放队列所占用的存储空间 EnQueue 前置条件:队列已存在 输入:元素值x 功能:在队尾插入一个元素 输出:如果插入不成功,抛出异常 后置条件:如果插入成功,队尾增加了一个元素,队列的抽象数据类型定义,3.2 队列,DeQueue 前置条件:队列已存在 输入:无 功能:删除队头元素 输出:如果删除成功,返回被删元素值 后置条件:如果删除成功,队头减少了一个元素 GetQueue 前置条件:队列已存在 输入:无 功能:读取队头元素 输出:若队列不空,返回队头元素 后置条件:队列不变,队列的抽象数据类型定义,3.2 队列,Empty 前置条件:队列已存在 输入:无 功能:判断队列是否为空 输出:如果队列为空,返回1,否则,返回0 后置条件:队列不变 endADT,队列的抽象数据类型定义,3.2 队列,队列的顺序存储结构及实现,顺序队列队列的顺序存储结构,如何改造数组实现队列的顺序存储?,例:a1a2a3a4依次入队,a1,a2,a3,a4,入队操作时间性能为O(1),3.2 队列,如何改造数组实现队列的顺序存储?,例:a1a2依次出队,队列的顺序存储结构及实现,a1,a2,a3,a4,3.2 队列,如何改造数组实现队列的顺序存储?,例:a1a2依次出队,队列的顺序存储结构及实现,a2,a3,a4,3.2 队列,如何改造数组实现队列的顺序存储?,例:a1a2依次出队,队列的顺序存储结构及实现,a3,a4,出队操作时间性能为O(n),3.2 队列,队列的顺序存储结构及实现,如何改进出队的时间性能?,3.2 队列,队列的顺序存储结构及实现,例:a1a2a3a4依次入队,a1,a2,a3,a4,入队操作时间性能仍为O(1),3.2 队列,约定:队头指针front指向队头元素的前一个位置, 队尾指针rear指向队尾元素。,例:a1a2依次出队,队列的顺序存储结构及实现,a1,a2,a3,a4,出队操作时间性能提高为O(1),3.2 队列,例:a1a2依次出队,队列的顺序存储结构及实现,a3,a4,队列的移动有什么特点?,3.2 队列,例:a1a2依次出队,队列的顺序存储结构及实现,a3,a4,3.2 队列,假溢出:当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间,这种现象叫做假溢出。,队列的顺序存储结构及实现,继续入队会出现什么情况?,a3,a4,a5,3.2 队列,循环队列:将存储队列的数组头尾相接。,队列的顺序存储结构及实现,如何解决假溢出?,0 1 2 3 4,入队,出队,a3,a4,a5,a6,3.2 队列,不存在物理的循环结构,用软件方法实现。 求模:(41)mod 50,队列的顺序存储结构及实现,如何实现循环队列?,0 1 2 3 4,入队,出队,a3,a4,a6,3.2 队列,如何判断循环队列队空?,队空的临界状态,队列的顺序存储结构及实现,0 1 2 3 4,入队,出队,a3,3.2 队列,如何判断循环队列队空?,执行出队操作,队空:front=rear,队列的顺序存储结构及实现,0 1 2 3 4,入队,出队,a3,3.2 队列,如何判断循环队列队满?,队满的临界状态,队列的顺序存储结构及实现,0 1 2 3 4,入队,出队,a3,a4,a5,a6,3.2 队列,如何判断循环队列队满?,执行入队操作,队满:front=rear,队列的顺序存储结构及实现,0 1 2 3 4,入队,出队,a3,a4,a5,a6,a7,3.2 队列,方法一:附设一个存储队列中元素个数的变量num,当num=0时队空,当num=QueueSize时为队满; 方法二:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元; 方法三:设置标志flag,当front=rear且flag=0时为队空,当front=rear且flag=1时为队满。,如何确定不同的队空、队满的判定条件? 为什么要将队空和队满的判定条件分开?,队列的顺序存储结构及实现,3.2 队列,队满的条件:(rear+1) mod QueueSize=front,队列的顺序存储结构及实现,3.2 队列,循 环 队 列 类 的 声 明,const int QueueSize=100; template class CirQueue public: CirQueue( ); CirQueue( ); void EnQueue(DataType x); DataType DeQueue( ); DataType GetQueue( ); bool Empty( ); private: DataType dataQueueSize; int front, rear; ;,3.2 队列,template void CirQueue :EnQueue(DataType x) if (rear+1) % QueueSize = front) throw “上溢“; rear =(rear+1) % QueueSize; datarear = x; ,循环队列的实现入队,a3,a4,a5,3.2 队列,0 1 2 3 4,入队,a4,a5,a6,出队,template DataType CirQueue :DeQueue( ) if (rear = front) throw “下溢“; front = (front + 1) % QueueSize; return datafront; ,循环队列的实现出队,a3,3.2 队列,template DataType CirQueue :GetQueue( ) if (rear = front) throw “下溢“; i = (front + 1) % QueueSize; return datai; ,循环队列的实现读队头元素,0 1 2 3 4,入队,a4,a5,a6,出队,a3,3.2 队列,队列的链接存储结构及实现,链队列:队列的链接存储结构,队头指针即为链表的头指针,如何改造单链表实现队列的链接存储?,3.2 队列,队列的链接存储结构及实现,非空链队列,front,rear,空链队列,front,rear,3.2 队列,链 队 列 类 的 声 明,template class LinkQueue public: LinkQueue( ); LinkQueue( ); void EnQueue(DataType x); DataType DeQueue( ); DataType GetQueue( ); bool Empty( ); private: Node *front, *rear; ;,3.2 队列,操作接口: LinkQueue( );,算法描述: template LinkQueue :LinkQueue( ) front = new Node; front-next = NULL; rear = front; ,链队列的实现构造函数,3.2 队列,链队列的实现入队,操作接口: void EnQueue(DataType x);,front,front,算法描述: s-next=NULL; rear-next=s; rear=s;,如何没有头结点会怎样?,3.2 队列,链队列的实现入队,操作接口: void EnQueue(DataType x);,front,算法描述: s-next=NULL; rear-next=s; rear=s;,如何没有头结点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中生涯启蒙未来规划说课稿2025
- 小学心理教育教案:2025年小学生社交能力说课稿
- 2026新教材语文 19《枣儿》教学课件
- 2026年小语教编常考的说课稿
- 2026年酒店管理加盟合同三篇
- 糖尿病临床路径PBL教学对血糖管理能力的影响
- 初中生2025年社会热点讨论说课稿
- 精准医疗设备:供应链融资创新
- 精准化孕期环境因素干预策略构建
- 2026年精神科设备维护保养记录
- 第七版apa格式参考文献模板
- 餐厨垃圾清运服务方案
- 广西建设领域专业技术人员三新技术网络培训考试题目及答案
- GB/T 42306-2023软木粒和软木粉分类、性质和包装
- 八大风格妆面及发型
- JJF 1905-2021磁通计校准规范
- GM/T 0001.3-2012祖冲之序列密码算法第3部分:基于祖冲之算法的完整性算法
- 关于规范贸易业务的指导意见
- 国开大政府经济学自测题1-14章
- 三轴深层搅拌桩机安装拆卸施工方案
- 心内科常见介入手术及护理心血管内科-课件
评论
0/150
提交评论