ImageVerifierCode 换一换
格式:PPT , 页数:83 ,大小:713.50KB ,
资源ID:6901330      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6901330.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构-特殊线性表栈和队列.ppt)为本站会员(fmgc7290)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

数据结构-特殊线性表栈和队列.ppt

1、第3章 特殊线性表栈、队列和串,本章的基本内容是:,三种特殊的线性表栈、队列、串,从数据结构角度看,栈和队列是操作受限的线性表,他们的逻辑结构相同。 串是重要的非数值处理对象,它是以字符作为数据元素的线性表。,特殊线性表栈,栈的逻辑结构,空栈:不含任何数据元素的栈。,(a1, a2, , an),栈:限定仅在表尾进行插入和删除操作的线性表。,允许插入和删除的一端称为栈顶,另一端称为栈底。,a1,a2,a3,入栈,出栈,特殊线性表栈,插入:入栈、进栈、压栈 删除:出栈、弹栈,栈的示意图,栈的操作特性:后进先出,a1,a2,a3,入栈,出栈,特殊线性表栈,插入:入栈、进栈、压栈 删除:出栈、弹栈,

2、栈的示意图,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,特殊线性表栈,a,b,c,情况1:,栈的逻辑结构,特殊线性表栈,a,b,c,出栈序列:c,出栈序列:c、b,出栈序列:c、b、a,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,栈的逻辑结构,情况1:,特殊线性表栈,a,b,出栈序列:b,情况2:,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,栈的逻辑结构,特殊线性表栈,a,出栈序列:b,出栈序列:b、c,出栈序列: b、 c、a,c,注意:

3、栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。,例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈,则可能的出栈序列有多少种?,栈的逻辑结构,情况2:,例题解析,习题2(1)(3),栈的抽象数据类型定义,特殊线性表栈,ADT Stack Data栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系 OperationInitStack前置条件:栈不存在输入:无功能:栈的初始化输出:无后置条件:构造一个空栈,DestroyStack前置条件:栈已存在输入:无功能:销毁栈输出:无后置条件:释放栈所占用的存储空间 Push 前置条件:栈已存在

4、输入:元素值x功能:在栈顶插入一个元素x输出:如果插入不成功,抛出异常后置条件:如果插入成功,栈顶增加了一个元素,栈的抽象数据类型定义,特殊线性表栈,Pop 前置条件:栈已存在输入:无功能:删除栈顶元素输出:如果删除成功,返回被删元素值,否则,抛出异常后置条件:如果删除成功,栈减少了一个元素 GetTop前置条件:栈已存在输入:无功能:读取当前的栈顶元素输出:若栈不空,返回当前的栈顶元素值后置条件:栈不变,栈的抽象数据类型定义,特殊线性表栈,Empty 前置条件:栈已存在输入:无功能:判断栈是否为空输出:如果栈为空,返回1,否则,返回0后置条件:栈不变 endADT,栈的抽象数据类型定义,特殊

5、线性表栈,栈的顺序存储结构及实现,顺序栈栈的顺序存储结构,如何改造数组实现栈的顺序存储?,a1,确定用数组的哪一端表示栈底。,特殊线性表栈,附设指针top指示栈顶元素在数组中的位置。,出栈:top减1,进栈:top加1,栈空:top= -1,特殊线性表栈,a1,a2,a3,栈满:top= MAX_SIZE-1,栈的顺序存储结构及实现,顺序栈类的声明,const int MAX_SIZE=100; template class seqStack public:seqStack ( ) ;seqStack ( );void Push ( T x );T Pop ( );T GetTop ( );b

6、ool Empty ( );private:T dataMAX_SIZE;int top; ,特殊线性表栈,顺序栈的实现入栈,template void seqStack:Push ( T x) if (top=MAX_SIZE-1) throw “溢出”;top+;datatop=x;,特殊线性表栈,操作接口: void Push( T x );,时间复杂度?,顺序栈的实现出栈,template T seqStack: Pop ( ) if (top=-1) throw “溢出”;x=datatop-;return x; ,特殊线性表栈,操作接口: T Pop( );,时间复杂度?,进制转换

7、,void Dec_to_Ocx(int a,int d)int div,x;SeqStack s;while(a!=0)div=a%d;s.Push(div);a=a/d;cout“转换后的数为:“;while(!s.Empty()x=s.GetTop();coutx;s.Pop();coutendl;,两栈共享空间,解决方案2:,顺序栈单向延伸使用一个数组来存储两个栈,特殊线性表栈,在一个程序中需要同时使用具有相同数据类型的两个栈,如何顺序存储这两个栈?,会出现什么问题?如何解决?,两栈共享空间:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,两个栈从

8、各自的端点向中间延伸。,特殊线性表栈,两栈共享空间,栈1的底固定在下标为0的一端; 栈2的底固定在下标为StackSize-1的一端。top1和top2分别为栈1和栈2的栈顶指针; Stack_Size为整个数组空间的大小(图中用S表示);,a1 a2 ai,0 1 2 S-1,两栈共享空间,两栈共享空间,bj b2 b1,两栈共享空间,top1= -1,什么时候栈1为空?,a1 a2 ai,0 1 2 S-1,两栈共享空间,bj b2 b1,两栈共享空间,top1= -1,什么时候栈1为空?,a1 a2 ai,0 1 2 S-1,两栈共享空间,bj b2 b1,什么时候栈2为空?,top2=

9、 Stack_Size,两栈共享空间,top1= -1,什么时候栈1为空?,a1 a2 ai,0 1 2 S-1,两栈共享空间,bj b2 b1,什么时候栈2为空?,top2= Stack_Size,什么时候栈满?,top2= top1+1,const int Stack_Size=100; template class BothStack public:BothStack( );BothStack( ); void Push(int i, T x); T Pop(int i); T GetTop(int i); bool Empty(int i); private:T dataStack_S

10、ize; int top1, top2; ;,两栈共享空间类的声明,两栈共享空间,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, T x) ;,1. 若是在栈1删除,则1.1 若栈1为空栈,抛出下溢异常;1.2 删除并返回栈1的栈顶元素; 2. 若是在栈2删除,则2.1 若栈2为空栈,抛出下溢异常;2.2 删除并返回栈2的栈顶元素;,

11、两栈共享空间,两栈共享空间的实现删除,操作接口:T Pop(int i) ;,括号匹配问题,int Bracket_Test(char *str)/判别表达式中三种括号是否匹配 SeqStack s;char *p,c;for(p=str;*p;p+)if(*p=(|*p=|*p=)s.Push(*p);else if(*p=)|*p=|*p=)if(s.Empty() return 0;c=s.Pop();if(*p=) ,栈的链接存储结构及实现,链栈:栈的链接存储结构,特殊线性表栈,链栈需要加头结点吗?,如何改造链表实现栈的链接存储?,将哪一端作为栈顶?,将链头作为栈顶,方便操作。,链栈不

12、需要附设头结点。,栈的链接存储结构及实现,栈顶,栈底,链栈:栈的链接存储结构,特殊线性表栈,两种示意图在内存中对应同一种状态,栈顶,栈底,链 栈 的 类 声 明,template class LinkStack public:LinkStack( );LinkStack( ); void Push(T x); T Pop( ); T GetTop( );bool Empty( );private:Node *top; ,特殊线性表栈,算法描述: template void LinkStack:Push(T x) s=new Node;s-data=x; s-next=top; top=s; ,

13、特殊线性表栈,an,an-1,a1,链栈的实现插入,操作接口: void Push(T x);,为 什 么 没 有 判 断 栈 满 ?,算法描述: template T LinkStack:Pop( ) if (top=NULL)throw “下溢“;x=top-data; p=top; top=top-next; delete p;return x; ,特殊线性表栈,链栈的实现插入,操作接口: T Pop( );,an,an-1,a1,top+可以吗?,顺序栈和链栈的比较,时间性能:相同,都是常数时间O(1)。,空间性能: 顺序栈:有元素个数的限制和空间浪费的问题。 链栈:没有栈满的问题,只

14、有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销。,特殊线性表栈,总之,当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈。,栈的应用举例递归,1 递归的定义,子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。,2 递归的基本思想,问题分解:把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的小问题,直至每个小问题都可以直接解决。,3 递归的要素, 递归边界条件:确定递归到何时终止,也称为递归出口; 递归模式:大问题是如何分解为小问题的,也称为递归体。,栈

15、的应用举例递归,例1 阶乘函数,递归算法 int fact ( int n ) if ( n = 0 ) return 1;else return n * fact (n-1); ,栈的应用举例递归,求解阶乘 n! 的过程,计算 fact(4),递归调用,回归求值,栈的应用举例递归,递归过程与递归工作栈,递归过程在实现时,需要自己调用自己。 层层向下递归,返回次序正好相反:递归调用n! (n-1)! (n-2)! 1!=1返回次序,栈的应用举例递归,递归函数的内部执行过程,每一次递归调用时,需要为过程中使用的参数、局部变量等另外分配存储空间。 每层递归调用需分配的空间形成递归工作记录,按后进先

16、出的栈组织。, 运行开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址; 每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈; 每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。,栈的应用举例递归,特殊线性表队列,队列的逻辑结构,空队列:不含任何数据元素的队列。,队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表。,允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头。,(a1, a2, , an),队列的操作特性:先进先出,a1,a2,a3,入队

17、,队尾,队头,出队,特殊线性表队列,队头,队列的逻辑结构,队列的抽象数据类型定义,ADT Queue Data队列中元素具有相同类型及先进先出特性,相邻元素具有前驱和后继关系 OperationInitQueue前置条件:队列不存在输入:无功能:初始化队列输出:无后置条件:创建一个空队列,特殊线性表队列,DestroyQueue前置条件:队列已存在输入:无功能:销毁队列输出:无后置条件:释放队列所占用的存储空间EnQueue 前置条件:队列已存在输入:元素值x功能:在队尾插入一个元素输出:如果插入不成功,抛出异常后置条件:如果插入成功,队尾增加了一个元素,队列的抽象数据类型定义,特殊线性表队列

18、,DeQueue 前置条件:队列已存在输入:无功能:删除队头元素输出:如果删除成功,返回被删元素值后置条件:如果删除成功,队头减少了一个元素GetQueue前置条件:队列已存在输入:无功能:读取队头元素输出:若队列不空,返回队头元素后置条件:队列不变,队列的抽象数据类型定义,特殊线性表队列,Empty 前置条件:队列已存在输入:无功能:判断队列是否为空输出:如果队列为空,返回1,否则,返回0后置条件:队列不变 endADT,队列的抽象数据类型定义,特殊线性表队列,队列的顺序存储结构及实现,顺序队列:队列的顺序存储结构,特殊线性表队列,如何改造数组实现队列的顺序存储?,例:a1a2a3a4依次入

19、队,a1,a2,a3,a4,入队操作时间性能为O(1),特殊线性表队列,如何改造数组实现队列的顺序存储?,例:a1a2依次出队,队列的顺序存储结构及实现,a1,a2,a3,a4,特殊线性表队列,如何改造数组实现队列的顺序存储?,例:a1a2依次出队,队列的顺序存储结构及实现,a2,a3,a4,特殊线性表队列,如何改造数组实现队列的顺序存储?,例:a1a2依次出队,队列的顺序存储结构及实现,a3,a4,出队操作时间性能为O(n),特殊线性表队列,队列的顺序存储结构及实现,如何改进出队的时间性能?,队头指针:front指向队头元素的前一个位置队尾指针:rear 指向队尾元素,特殊线性表队列,队列的

20、顺序存储结构及实现,例:a1a2a3a4依次入队,a1,a2,a3,a4,入队操作时间性能仍为O(1),例:a1a2依次出队,特殊线性表队列,队列的顺序存储结构及实现,a1,a2,a3,a4,出队操作时间性能提高为O(1),例:a1a2依次出队,特殊线性表队列,队列的顺序存储结构及实现,a3,a4,队列的移动有什么特点?,例:a1a2依次出队,特殊线性表队列,队列的顺序存储结构及实现,a3,a4,假溢出:当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间,这种现象叫做假溢出。,特殊线性表队列,队列的顺序存储结构及实现,继续入队会出现什么情况?,a3,a

21、4,a5,循环队列:将存储队列的数组头尾相接。,特殊线性表队列,队列的顺序存储结构及实现,如何解决假溢出?,0 1 2 3 4,入队,出队,a3,a4,a5,a6,特殊线性表队列,不存在物理的循环结构,用软件方法实现。 求模:(41)mod 50,队列的顺序存储结构及实现,如何实现循环队列?,0 1 2 3 4,入队,出队,a3,a4,a6,如何判断循环队列队空?,特殊线性表队列,队空的临界状态,队列的顺序存储结构及实现,0 1 2 3 4,入队,出队,a3,如何判断循环队列队空?,特殊线性表队列,执行出队操作,队空:front=rear,队列的顺序存储结构及实现,0 1 2 3 4,入队,出

22、队,a3,如何判断循环队列队满?,队满的临界状态,队列的顺序存储结构及实现,特殊线性表队列,0 1 2 3 4,入队,出队,a3,a4,a5,a6,如何判断循环队列队满?,执行入队操作,队满:front=rear,队列的顺序存储结构及实现,特殊线性表队列,0 1 2 3 4,入队,出队,a3,a4,a5,a6,a7,方法一:附设一个存储队列中元素个数的变量num,当num=0时队空,当num=QueueSize时为队满; 方法二:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元; 方法三:设置标志flag,当front=rear且flag=0时为队空,当front=rear且fla

23、g=1时为队满。,如何确定不同的队空、队满的判定条件? 为什么要将队空和队满的判定条件分开?,特殊线性表队列,队列的顺序存储结构及实现,队满的条件:(rear+1) mod QueueSize=front,队列的顺序存储结构及实现,特殊线性表队列,数组用来表示一个循环队列,为当前队列头元素的前一位置,为队尾元素的位置,假定队列中元素的个数小于,计算队列中元素的公式为 ()rf; ()(nfr)% n; ()nrf; ()(nrf)% n,循 环 队 列 类 的 声 明,const int QueueSize=100; template class CirQueue public:CirQueu

24、e( ); CirQueue( );void EnQueue(T x); T DeQueue( ); T GetQueue( ); bool Empty( );private:T dataQueueSize; int front, rear; ;,特殊线性表队列,template void CirQueue:EnQueue(T x)if (rear+1) % QueueSize =front) throw “上溢“;rear=(rear+1) % QueueSize; datarear=x; ,特殊线性表队列,循环队列的实现入队,a3,a4,a5,0 1 2 3 4,入队,a4,a5,a6,出

25、队,template T CirQueue:DeQueue( ) if (rear=front) throw “下溢“; front=(front+1) % QueueSize; return datafront; ,特殊线性表队列,循环队列的实现出队,a3,template T CirQueue:GetQueue( ) if (rear=front) throw “下溢“; i=(front+1) % QueueSize; return datai; ,特殊线性表队列,循环队列的实现读队头元素,0 1 2 3 4,入队,a4,a5,a6,出队,a3,队列的链接存储结构及实现,链队列:队列的链

26、接存储结构,队头指针即为链表的头指针,特殊线性表队列,如何改造单链表实现队列的链接存储?,队列的链接存储结构及实现,特殊线性表队列,非空链队列,front,rear,空链队列,front,rear,链 队 列 类 的 声 明,template class LinkQueue public:LinkQueue( ); LinkQueue( ); void EnQueue(T x);T DeQueue( ); T GetQueue( );bool Empty( );private:Node *front, *rear; ;,特殊线性表队列,操作接口: LinkQueue( );,算法描述: tem

27、plate LinkQueue:LinkQueue( ) front=new Node; front-next=NULL; rear=front; ,特殊线性表队列,链队列的实现构造函数,特殊线性表队列,链队列的实现入队,操作接口: void EnQueue(T x);,front,front,算法描述: s-next=NULL; rear-next=s; rear=s;,如何没有头结点会怎样?,特殊线性表队列,链队列的实现入队,操作接口: void EnQueue(T x);,front,算法描述: s-next=NULL; rear-next=s; rear=s;,如何没有头结点会怎样?,

28、特殊线性表队列,链队列的实现入队,操作接口: void EnQueue(T x);,front,front=rear=NULL,算法描述: s-next=NULL; rear=s; front=s;,如何没有头结点会怎样?,特殊线性表队列,链队列的实现入队,template void LinkQueue:EnQueue(T x) s=new Node; s-data=x; s-next=NULL;rear-next=s; rear=s; ,特殊线性表队列,链队列的实现出队,front,rear,算法描述: p=front-next; front-next=p-next;,特殊线性表队列,链队列

29、的实现出队,front,rear,考虑边界情况:队列中只有一个元素?,front,算法描述: if (p-next=NULL) rear=front;,如何判断边界情况?,template T LinkQueue:DeQueue( ) if (rear=front) throw “下溢“;p=front-next; x=p-data; front-next=p-next; if (p-next=NULL) rear=front; delete p;return x; ,特殊线性表队列,链队列的实现出队,循环队列和链队列的比较,时间性能: 循环队列和链队列的基本操作都需要常数时间O (1)。,空

30、间性能: 循环队列:必须预先确定一个固定的长度,所以有存储元素个数的限制和空间浪费的问题。 链队列:没有队列满的问题,只有当内存没有可用空间时才会出现队列满,但是每个元素都需要一个指针域,从而产生了结构性开销。,特殊线性表队列,判回文,int Palindrome_Test(char *str)/判别输入的字符串是否回文序列,是则返回1,否则返回0 CirQueue Q;SeqStack S;char a,b,c;int i=0;while(c=stri)!=0)S.Push(c);Q.EnQueue(c); /同时使用栈和队列两种结构i+;while(!S.Empty()a=S.Pop();b=Q.DeQueue();if(a!=b) return 0;return 1; /Palindrome_Test,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报