第三章栈队列和递归精选文档.ppt
《第三章栈队列和递归精选文档.ppt》由会员分享,可在线阅读,更多相关《第三章栈队列和递归精选文档.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章栈队列和递归本讲稿第一页,共七十三页特殊线性表特殊线性表 栈栈队队 列列 串串栈的定义栈的定义操作特性操作特性ADTADT定义定义队列定义队列定义操作特性操作特性ADTADT定义定义串的定义串的定义基本概念基本概念ADTADT定义定义顺顺序序栈栈链链栈栈循循环环队队列列链链队队列列顺顺序序存存储储链链接接存存储储逻辑结构逻辑结构存储结构存储结构逻辑逻辑结构结构逻辑逻辑结构结构存储存储结构结构存储存储结构结构比比 较较模式匹配模式匹配比较比较比较比较基本操作的实现基本操作的实现时间复杂度时间复杂度基本操作的实现基本操作的实现时间复杂度时间复杂度本讲稿第二页,共七十三页3.13.1栈栈(St
2、ack)3.2 3.2 队列队列 (Queue).逻辑结构逻辑结构.存储结构与实现存储结构与实现.应用实例应用实例.逻辑结构逻辑结构.存储结构与实现存储结构与实现.应用实例应用实例本讲稿第三页,共七十三页.1 .1 栈栈栈栈1 1、栈的逻辑结构、栈的逻辑结构空栈:空栈:不含任何数据元素的栈。不含任何数据元素的栈。(a1,a2,an)栈:栈:限定仅在限定仅在一端一端进行进行插入和删除插入和删除操作的操作的线性表线性表。栈顶栈顶栈底栈底允许允许插入和删除插入和删除的的一端一端称为称为栈顶栈顶,另一端另一端称为称为栈底栈底。数据元素之间的逻辑关系:数据元素之间的逻辑关系:一对一一对一 。本讲稿第四页
3、,共七十三页注:注:栈的运算规则栈的运算规则只能在只能在栈顶栈顶运算,且访问结点时依照运算,且访问结点时依照后进先出后进先出(LIFO)或或先进后出(先进后出(FILO)的原则。的原则。入栈:入栈:插入元素到栈顶(即表尾)的操作。插入元素到栈顶(即表尾)的操作。出栈:出栈:从栈顶(即表尾)删除最后一个元素的操作。从栈顶(即表尾)删除最后一个元素的操作。问:栈问:栈与与一般线性表一般线性表有什么不同?有什么不同?一般线性表一般线性表 (堆)栈(堆)栈逻辑结构:一对一逻辑结构:一对一 逻辑结构:一对一逻辑结构:一对一存储结构:顺序表、链表存储结构:顺序表、链表 存储结构:顺序栈、链栈存储结构:顺序
4、栈、链栈运算规则:运算规则:随机存取随机存取 运算规则:运算规则:后进先出后进先出(LIFO)入栈操作演示入栈操作演示出出栈栈操作演示操作演示本讲稿第五页,共七十三页a1a2a3入栈入栈栈底栈底栈顶栈顶插入:入栈、进栈、压栈插入:入栈、进栈、压栈栈顶栈顶栈顶栈顶入栈的操作示图:入栈的操作示图:栈顶栈顶本讲稿第六页,共七十三页a1a2a3栈底栈底栈顶栈顶删除:出栈、弹栈删除:出栈、弹栈栈顶栈顶栈顶栈顶出栈的操作示图:出栈的操作示图:栈顶栈顶栈的操作特性:栈的操作特性:后进先出后进先出出栈出栈本讲稿第七页,共七十三页思考题:思考题:一个栈的输入序列为一个栈的输入序列为123123,若在入栈的过程,
5、若在入栈的过程中允许出栈,且每个元素只允许进一次栈,则可能得中允许出栈,且每个元素只允许进一次栈,则可能得到的出栈序列有哪些?到的出栈序列有哪些?答:答:可以通过穷举所有可能性来求解:可以通过穷举所有可能性来求解:1 1入入1 1出,出,2 2入入2 2出,出,3 3入入3 3出,出,即即123123;1 1入入1 1出,出,2 2、3 3入入3 3、2 2出,出,即即132132;1 1、2 2入,入,2 2出,出,3 3入入3 3出,出,即即231231;1 1、2 2入,入,2 2、1 1出,出,3 3入入3 3出,出,即即213213;1 1、2 2、3 3入,入,3 3、2 2、1
6、1出,出,即即321321;合计有合计有5 5种可能性。种可能性。本讲稿第八页,共七十三页思考题:思考题:设依次进入一个栈的元素序列为设依次进入一个栈的元素序列为c,a,b,d,则可则可得到出栈的元素序列是:得到出栈的元素序列是:)a,b,c,d )c,d,a,b )b,c,d,a )a,c,d,bA、D可以可以(B、C不行)。不行)。讨论:有无通用的判别原则讨论:有无通用的判别原则?有。有。若输入序列若输入序列i i,j j,k k,则不存在输出序例,则不存在输出序例k k、i i、j;j;答:答:本讲稿第九页,共七十三页2、栈的存储结构、栈的存储结构顺序栈、链式栈顺序栈、链式栈()顺序栈(
7、)顺序栈栈的栈的顺序存储顺序存储结构结构(重点重点)如何改造数组实现栈的顺序存储?如何改造数组实现栈的顺序存储?0 1 2 3 4 5 6 7 8a1确定确定用数组的哪一端表示用数组的哪一端表示栈底栈底。附设指针附设指针top指示栈顶元素在数组中的位置。指示栈顶元素在数组中的位置。topS本讲稿第十页,共七十三页进栈核心语句:进栈核心语句:top+;Stop=a1;栈空:栈空:top=-1 0 1 2 3 4 5 6 7 8topa1topa2top进栈的操作步骤如何?进栈的操作步骤如何?本讲稿第十一页,共七十三页 0 1 2 3 4 5 6 7 8a1a2栈满:栈满:top=MAX_SIZE
8、-1栈满的如何判断?栈满的如何判断?topa3a4a5a6a7a8a9本讲稿第十二页,共七十三页动态栈动态栈类的定义:类的定义:template /定义模板类定义模板类DSeqStackclass DSeqStackpublic:DSeqStack(int size);/构造函数,栈的初始化构造函数,栈的初始化DSeqStack()delete S;/析构函数析构函数 void Push(const type&item);/将元素将元素item入栈入栈 type Pop();/将栈顶元素弹出将栈顶元素弹出 type GetTop();/取栈顶元素(并不删除)取栈顶元素(并不删除)int Emp
9、ty()return top=-1;/判断栈是否为空判断栈是否为空int full()constreturn top=MaxSize-1;/为满则返回为满则返回1,否则返回,否则返回0void clear()top=-1;/清空栈清空栈private:type*S;/存放栈元素的数组起始地址存放栈元素的数组起始地址 int top;/栈顶指针,指示栈顶元素在数组中的下标栈顶指针,指示栈顶元素在数组中的下标int MaxSize;/栈最大可容纳元素个数栈最大可容纳元素个数;本讲稿第十三页,共七十三页顺序栈的顺序栈的构造函数算法构造函数算法实现实现template DSeqStack:DSeqSt
10、ack(int size):top(-1),MaxSize(size)/建立一个最大尺寸为建立一个最大尺寸为size的空栈的空栈S=new typeMaxSize;/创建存储栈的数组创建存储栈的数组if(S=NULL)/分配不成功分配不成功 cerr动态存储失败!动态存储失败!endl;exit(1);/stdlib.h操作接口:操作接口:template DSeqStack:DSeqStack(int size);算法实现:算法实现:本讲稿第十四页,共七十三页顺序栈的顺序栈的入栈操作算法入栈操作算法实现实现template void DSeqStack:Push(const type&ite
11、m)if(top=MaxSize-1)throw 栈满!栈满!;top+;/栈未满,则入栈栈未满,则入栈 Stop=item;操作接口:操作接口:template void DSeqStack:Push(const type&item)算法实现:算法实现:时间复杂度?时间复杂度?O(1)本讲稿第十五页,共七十三页出栈核心语句:出栈核心语句:Item=Stop;top-;边界条件边界条件栈空:栈空:top=-1;0 1 2 3 4 5 6 7 8topa1topa2top出栈的操作步骤如何?出栈的操作步骤如何?本讲稿第十六页,共七十三页顺序栈的顺序栈的出栈操作算法出栈操作算法实现实现templa
12、te type DSeqStack:Pop()type item;if(top=-1)throw 栈空!栈空!;item=Stop-;/等价于等价于item=Stop;top-;return item;操作接口:操作接口:template type DSeqStack:Pop();算法实现:算法实现:时间复杂度?时间复杂度?O(1)本讲稿第十七页,共七十三页其它类型栈举例:如两栈共享空间其它类型栈举例:如两栈共享空间 解决方案解决方案1 1:直接解决:为每个栈开辟一个数组空间。直接解决:为每个栈开辟一个数组空间。解决方案解决方案2 2:使使用用一一个个数数组组来来存存储储两两个个栈栈。使使用用
13、一一个个数数组组来来存存储储两两个个栈栈,让让一一个个栈栈的的栈栈底底为为该该数数组组的的始始端端,另另一一个个栈栈的的栈栈底底为为该该数数组组的的末末端端,两两个个栈栈从从各各自自的的端端点点向向中中间延伸。间延伸。在一个程序中需要在一个程序中需要同时同时使用具有使用具有相同相同数据类型的数据类型的两个栈两个栈,如何顺序存储这两个栈?如何顺序存储这两个栈?会出现什么问题?如何解决?会出现什么问题?如何解决?本讲稿第十八页,共七十三页栈栈1的的栈底栈底:固定靠下标为固定靠下标为0的这一端;的这一端;栈栈2的的栈底栈底:固定靠下标为固定靠下标为MaxSize-1的这一端。的这一端。top1和和t
14、op2分别为栈分别为栈1和栈和栈2的栈顶指针;的栈顶指针;MaxSize:整个数组空间的大小(图中用整个数组空间的大小(图中用S表示);表示);a1 a2 aitop10 1 2 S-1top2bj b2 b1栈栈1底底栈栈2底底两栈共享空间栈顶与栈底如何设置?两栈共享空间栈顶与栈底如何设置?本讲稿第十九页,共七十三页栈栈1为空条件:为空条件:top1=-1栈栈2为空条件:为空条件:top2=MaxSize什么时候两栈为空?什么时候两栈为空?0 1 2 S-1top2top1本讲稿第二十页,共七十三页a1 a2 aitop10 1 2 S-1top2bj b2 b1栈满条件栈满条件为:为:to
15、p2=top1+1什么时候栈为满?什么时候栈为满?本讲稿第二十一页,共七十三页()链式栈()链式栈栈的栈的链式存储链式存储结构结构如何改造链表实现栈的链接存储?链栈需要加如何改造链表实现栈的链接存储?链栈需要加头结点吗?将哪一端作为栈顶?头结点吗?将哪一端作为栈顶?注:注:链栈不需要附设头结点。链栈不需要附设头结点。(栈底栈底)(栈顶栈顶)topa3a2a4a1本讲稿第二十二页,共七十三页链栈链栈类的定义:类的定义:template class LinkStack;/声明声明template class Node friend class LinkStack;private:type data
16、;Node*next;/此处此处也可以省略也可以省略;template class LinkStackpublic:LinkStack();/构造函数,置空链栈构造函数,置空链栈 LinkStack();/析构函数,释放链栈中各结点的存储空间析构函数,释放链栈中各结点的存储空间 void Push(type item);/将元素将元素item入栈入栈 type Pop();/将栈顶元素出栈将栈顶元素出栈 type GetTop();/取栈顶元素(并不删除)取栈顶元素(并不删除)bool Empty();/判断链栈是否为空栈判断链栈是否为空栈private:Node*top;/栈顶指针即链栈的头
17、指针栈顶指针即链栈的头指针;本讲稿第二十三页,共七十三页链栈的链栈的构造函数算法构造函数算法实现实现template LinkStack:LinkStack()top=NULL;/初始化空栈初始化空栈操作接口:操作接口:template LinkStack:LinkStack();算法实现:算法实现:本讲稿第二十四页,共七十三页算法实现:算法实现:template void inkStack:Push(type x)Node*s;s=new Node;s-data=x;s-next=top;top=s;topanan-1a1链栈的入栈算法实现链栈的入栈算法实现 xstop操作接口:操作接口:t
18、emplate void LinkStack:Push(type x);为为什什么么没没有有判判断断栈栈满满?本讲稿第二十五页,共七十三页算法实现:算法实现:template type LinkStack:Pop()Node*p;type x;if(top=NULL)throw“栈空栈空;x=top-data;p=top;top=top-next;delete p;return x;链栈的出栈算法实现:链栈的出栈算法实现:操作接口:操作接口:template T LinkStack:Pop();topanan-1a1topp top+可以吗?可以吗?本讲稿第二十六页,共七十三页顺序栈和链栈的比
19、较顺序栈和链栈的比较时间性能:时间性能:相同,都是常数时间相同,都是常数时间O(1)。空间性能:空间性能:顺序栈:顺序栈:有元素个数的限制和空间浪费的问题。有元素个数的限制和空间浪费的问题。链栈:链栈:没有没有栈满栈满的问题,只有当内存没有可用空间时的问题,只有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个才会出现栈满,但是每个元素都需要一个指针域指针域,从而产,从而产生了结构性生了结构性开销开销。总之,采用总之,采用顺序栈存储顺序栈存储方式,方式,可可使多个栈使多个栈共享空共享空间间;当栈中元素;当栈中元素个数变化个数变化较较大大,且存在多个栈的情况下,且存在多个栈的情况下,链栈链
20、栈是栈的首选存储方式。是栈的首选存储方式。本讲稿第二十七页,共七十三页1.调用函数或子程序非它莫属;调用函数或子程序非它莫属;2.递归运算的有力工具;递归运算的有力工具;3.用于保护现场和恢复现场;用于保护现场和恢复现场;4.简化了程序设计的问题;简化了程序设计的问题;5.其它应用:如括号匹配问题、表达其它应用:如括号匹配问题、表达式计算问题等。式计算问题等。答:答:3 3、栈的应用举例、栈的应用举例为什么要设计栈?它有什么独特用途?为什么要设计栈?它有什么独特用途?本讲稿第二十八页,共七十三页数制转换(十转八进制)数制转换(十转八进制)设计思路:设计思路:用用栈栈暂暂存存低位值低位值算法分析
21、:算法分析:N N div 8 N mod 8 74 9 2 9 1 1 1 0 1栈的应用实例栈的应用实例:如:如:(74)10=(112)8本讲稿第二十九页,共七十三页void conversion()/对于输入的任意一个非负十进制整数,对于输入的任意一个非负十进制整数,/打印输出与其等值的八进制数;打印输出与其等值的八进制数;SeqStack s1(10);int N,n;int e;cout请输入一十进制数:请输入一十进制数:N;n=N;while(n)s1.Push(n%);n=n/;while(!s1.Empty()e=s1.Pop();coute;coutendl;本讲稿第三十页
22、,共七十三页3.13.1栈栈(Stack)3.2 3.2 队列队列 (Queue).逻辑结构逻辑结构.存储结构与实现存储结构与实现.应用实例应用实例.逻辑结构逻辑结构.存储结构与实现存储结构与实现本讲稿第三十一页,共七十三页.2 .2 队列队列队列队列1 1、队列的逻辑结构、队列的逻辑结构空队:空队:不含任何数据元素的队列。不含任何数据元素的队列。(a1,a2,an)队列:队列:只允许在只允许在一端一端进行进行插入插入操作,而在操作,而在另一端另一端进行进行删除删除操作的操作的线性表线性表。队尾队尾队头队头允许允许插入插入的的一端一端称为称为队尾队尾,另一端另一端允许允许删除删除的称为的称为队
23、头队头。数据元素之间的逻辑关系:数据元素之间的逻辑关系:一对一一对一 。本讲稿第三十二页,共七十三页注:注:队列队列的的运算规则运算规则只能在只能在队尾队尾进行进行插入插入运算,在运算,在队头队头进行进行删除删除运算运算;且访问结点时依照且访问结点时依照先进先出(先进先出(FIFO)或或后进后出后进后出(LILO)的原则。的原则。入队:入队:插入元素到队列的队尾的操作。插入元素到队列的队尾的操作。出队:出队:从队头删除一个元素的操作。从队头删除一个元素的操作。问:队列问:队列与与一般线性表一般线性表有什么不同?有什么不同?一般线性表一般线性表 队列队列逻辑结构:一对一逻辑结构:一对一 逻辑结构
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 队列 递归 精选 文档
限制150内