第三章 栈和队列10.17(1).ppt
《第三章 栈和队列10.17(1).ppt》由会员分享,可在线阅读,更多相关《第三章 栈和队列10.17(1).ppt(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构数据结构3栈和队列栈和队列13 栈和队列开始学习本章前要掌握:开始学习本章前要掌握:u从数据结构角度看,栈和队列仍属于线性从数据结构角度看,栈和队列仍属于线性结构,具有线性结构的共同特征;结构,具有线性结构的共同特征;u学习本章时,要注意到栈和队列所具有的学习本章时,要注意到栈和队列所具有的线性结构的共性,更要掌握其个性;线性结构的共性,更要掌握其个性;u栈和队列是操作受限的线性结构栈和队列是操作受限的线性结构;23 栈和队列33 栈和队列主要内容主要内容栈的类型定义栈的类型定义栈的表示栈的表示顺序表示顺序表示链表表示链表表示栈的应用栈的应用进制转换进制转换括号匹配括号匹配地图四染色问
2、题地图四染色问题走迷宫走迷宫表达式计算表达式计算栈和递归栈和递归队列的类型定义队列的类型定义队列的表示队列的表示链表表示链表表示顺序表示:循环队列顺序表示:循环队列队列的应用队列的应用杨辉三角杨辉三角划分子集问题划分子集问题农夫过河农夫过河43 栈和队列栈的类型定义栈的类型定义定义定义只允许在同一端删除、同一端插入的线性表只允许在同一端删除、同一端插入的线性表允许插入、删除的一端叫做栈顶允许插入、删除的一端叫做栈顶(top),另一端,另一端叫做栈底叫做栈底(bottom)bottomtop特性特性先进后出先进后出(FILO,First In Last Out)举例:餐馆的盘子举例:餐馆的盘子5
3、3 栈和队列通常通常栈底栈底固定固定,栈顶栈顶移动移动。栈的类型定义栈的类型定义63 栈和队列栈的基本操作栈的基本操作1.插入插入(进栈、入栈)(进栈、入栈)2.删除删除(出栈、退栈)(出栈、退栈)3.测试栈是否为空测试栈是否为空4.测试栈是否已满测试栈是否已满5.检索当前栈顶元素检索当前栈顶元素73 栈和队列(a)栈空。栈顶元素所对应的下标值栈空。栈顶元素所对应的下标值 top=-1。顺序栈的几种状态顺序栈的几种状态(最大长度最大长度maxsize为为4)(b)表示在表示在(a)基础上执行基础上执行Push(S,A)后后的状态。的状态。(c)元素元素B、C、D先后入栈,栈顶元素的下标值先后入
4、栈,栈顶元素的下标值top=3。栈满。栈满。(d)表示在表示在(c)状态下,执行一次状态下,执行一次Pop(S,x)运算得到。运算得到。(e)表示在表示在(d)状态下,执行三次状态下,执行三次Pop(S,x)运算得到。此时栈顶下运算得到。此时栈顶下标值标值 top=-1,又变成栈空状态。又变成栈空状态。top-10123(a)topA0123(b)topBCDA0123(c)topABC0123(d)top-10123(e)83 栈和队列栈的表示:顺序存储结构栈的表示:顺序存储结构一、构造原理一、构造原理 描述栈的顺序存储结构最简单的方法是利用描述栈的顺序存储结构最简单的方法是利用一维数组一维
5、数组datamaxsize来表示,同时定义一个来表示,同时定义一个整型变量整型变量(不妨取名为不妨取名为top)给出栈顶元素的位置。给出栈顶元素的位置。maxsize-193 栈和队列typedef struct datatype datamaxsize;int top;/栈顶指针栈顶指针栈顶指针栈顶指针 SeqStack;初始时,初始时,top=-1103 栈和队列初始化:初始化:栈内没有元素栈内没有元素void SETNULL(SeqStack*s)s-top =-1;int EMPTY(SeqStack*S)if(s-top=-1)return TRUE;else return FALS
6、E;判空栈操作:判空栈操作:01234s-top空栈空栈二、栈的基本操作及算法二、栈的基本操作及算法113 栈和队列SeqStack*PUSH(SeqStack*s,datatype x)/*上溢的情况上溢的情况*/if(s-top=maxsize-1)printf(“overflow”);return NULL;else s-data+s-top=x;return s;进栈操作:进栈操作:栈满栈满s-top856074559001234123 栈和队列 datatype POP(SeqStack*s)/*下溢的情况下溢的情况*/if(EMPTY(s)printf(“underflow”);r
7、eturn NULL;else return s-datas-top-;出栈操作:出栈操作:s-top8560745501234133 栈和队列datatype TOP(SeqStack*s)/*栈空的情况栈空的情况*/if(EMPTY(s)printf(“stack is empty”);return NULL;else return(s-datas-top);取栈顶元素取栈顶元素返回返回“55”s-top8560745501234143 栈和队列(1)如果进站的车厢序列为如果进站的车厢序列为123,则出站车厢序列是什,则出站车厢序列是什么?么?【例例】火车站列车调度示意图如下,假设调度站两
8、侧火车站列车调度示意图如下,假设调度站两侧的轨道为单向行驶轨道。的轨道为单向行驶轨道。出站出站进站进站123,132,213,231,321(2)如果进站的车厢序列为如果进站的车厢序列为123456,问能否得到,问能否得到135426和和435612的出站序列。的出站序列。153 栈和队列三、多栈共享连续空间的问题三、多栈共享连续空间的问题(以两个栈共享一个数组为例)(以两个栈共享一个数组为例)STACKmaxsizetop0、top1分别为第分别为第1个与第个与第2个栈的栈顶元素指针。个栈的栈顶元素指针。插插入入当当i=1时,将时,将item插入第插入第1个栈,个栈,当当i=2时,将时,将i
9、tem插入第插入第2个栈。个栈。第第1个栈个栈可用空间可用空间第第2个栈个栈0 1 2 maxsize-1top0top1163 栈和队列maxsize-1第第1个栈个栈可用空间可用空间第第2个栈个栈0 1 2 maxsize-1top0top1173 栈和队列删删除除当当i=1时,删除第时,删除第1个栈的栈顶元素,个栈的栈顶元素,当当i=2时,删除第时,删除第2个栈的栈顶元素。个栈的栈顶元素。top0=-1第第1栈栈空的条件栈栈空的条件top1=maxsize第第2栈栈空的条件栈栈空的条件栈栈空空可用空间可用空间0 1 2 maxsize-1第第1个栈个栈可用空间可用空间第第2个栈个栈0 1
10、 2 maxsize-1top0top1183 栈和队列两个栈的共享存储单元可用两个栈的共享存储单元可用C语言描述如下:语言描述如下:#define maxsize typedef struct datatype datamaxsize;/共享数组的大小共享数组的大小 int top2;/两个栈顶指针两个栈顶指针SeqSTACK;193 栈和队列 栈的链式实现是以链表作为栈的存储结构,并实栈的链式实现是以链表作为栈的存储结构,并实现栈的基本运算。栈的链式实现称为链栈。(现栈的基本运算。栈的链式实现称为链栈。(DCBA四个元素进栈演示)四个元素进栈演示)栈的表示:链式存储栈的表示:链式存储typ
11、edef struct node datatype data;struct node*next;LinkSTACK;LinkSTACK*top;B C A栈顶栈顶 栈底栈底topNULLD有没有必要像单链表有没有必要像单链表那样附加头结点那样附加头结点?203 栈和队列栈的表示:链式表示栈的表示:链式表示链式表示链式表示使用链表来实现使用链表来实现栈不就是线性表栈不就是线性表+LIFO限制么?限制么?参照线性表的链式表示参照线性表的链式表示213 栈和队列void Init_LS(LinkSTACK*top)top=NULL;栈初始化栈初始化判栈空判栈空int Empty_LS(LinkSTA
12、CK*top)if(top=NULL)return TURE;else return FALSE;223 栈和队列LinkSTACK*Push_LS(LinkSTACK*top,datatype x)LinkSTACK*p;p=(LinkSTACK*)malloc(sizeof(LinkSTACK);p-data=x;/*将将x送到新结点数据域送到新结点数据域*/p-next=top;/*将新结点插在链表最前面将新结点插在链表最前面*/top=p;/*修改栈顶指针的指向修改栈顶指针的指向*/return top;入栈入栈:等效于在链表最前面插入一个新结点等效于在链表最前面插入一个新结点时间复杂
13、度时间复杂度O(1)不必判断栈不必判断栈满满233 栈和队列int*Pop_LS(LinkSTACK*top,datatype x)LinkSTACK*p;if(Empty_LS(top)printf(“Stack underflow.”);/*下溢下溢*/return OVERFLOW;else p=top;/*暂时保存栈顶结点的地址暂时保存栈顶结点的地址*/x=top-data;/*保存被删栈顶的数据信息保存被删栈顶的数据信息*/top=top-next;/*删除栈顶结点删除栈顶结点*/free(p);/*释放被删除结点释放被删除结点*/return OK;出栈出栈:时间复杂度时间复杂度O
14、(1)仍然要判断栈空仍然要判断栈空243 栈和队列int GetTop(LinkSTACK*top,datatype y)if(Empty_LS(top)printf(“Stack underflow.”);/*下溢下溢*/return OVERFLOW;else y=top-data;return OK;取栈顶元素取栈顶元素topdata next A B C253 栈和队列栈的应用栈的应用栈的应用栈的应用颠倒元素顺序颠倒元素顺序直接应用栈先进后出的特性直接应用栈先进后出的特性数制转换数制转换记录记录“历史信息历史信息”括号匹配的检验括号匹配的检验地图四染色问题地图四染色问题走迷宫走迷宫表达
15、式计算表达式计算263 栈和队列栈的应用栈的应用:数制转换数制转换把十进制数转换为八进制数。把十进制数转换为八进制数。例如例如:(1348)10=(2504)8 1348/8=168,1348%8=4最低位最低位 168/8=21,168%8=0 21/8=2,21%8=5 2/8=0,2%8=2最高位最高位(1348)10=1*103+3*102+4*101+8*100;(2504)8=2*83+5*82+0*81+4*80;273 栈和队列数制转换的非递归算法数制转换的非递归算法void conversion(int N)/*把十进制转换为八进制把十进制转换为八进制*/top=-1;/*存
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三章 栈和队列10.171 第三 队列 10.17
限制150内