数据结构第三章.pptx
《数据结构第三章.pptx》由会员分享,可在线阅读,更多相关《数据结构第三章.pptx(93页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章第三章 栈和队列栈和队列3.1 3.1 栈栈3.2 3.2 栈的应用举例栈的应用举例3.3 3.3 队列队列第1页/共93页3.1栈一、栈的定义一、栈的定义二、抽象数据类型栈的定义二、抽象数据类型栈的定义三、栈的表示和实现三、栈的表示和实现四、栈的应用举例四、栈的应用举例第2页/共93页一、栈的定义1 1定义定义栈栈(Stack)(Stack)是是一一种种特特殊殊的的线线性性表表,其其插插入入和和删删除除操操作作均均在在表表的的一一端端进进行行,是是一种一种运算受限运算受限的线性表。的线性表。栈顶栈顶(top)(top)允许插入和删除的一端,又称允许插入和删除的一端,又称表尾。表尾。栈底
2、栈底(bottom)(bottom)栈的另一端,又称栈的另一端,又称表头表头。若给栈若给栈S=(aS=(a1 1,a,a2 2a ai i,a an n),则,则a a1 1 为栈底元素,为栈底元素,a an n 为栈顶元素,如图所示。为栈顶元素,如图所示。进栈进栈(push)(push)在栈顶插入一个元素,在栈顶插入一个元素,又称又称入栈或压入入栈或压入。出栈出栈(pop)(pop)在栈顶删除一个元素,在栈顶删除一个元素,又称又称退栈或弹出退栈或弹出。空栈空栈栈中没有元素栈中没有元素(n=0)(n=0)。3.13.1栈栈第3页/共93页2 2栈的特点栈的特点后进先出后进先出(Last In
3、First Out(Last In First Out,简称,简称LIFOLIFO)。又称栈为后进先出表又称栈为后进先出表(简称简称LIFOLIFO结构结构)。一、栈的定义3.13.1栈栈第4页/共93页 对对栈栈的的操操作作除除了了在在栈栈顶顶进进行行插插入入和和删删除除外外,还还有有栈栈的的初初始始化化、判判空空及及取取栈顶元素等。栈顶元素等。其抽象数据类型定义如下:其抽象数据类型定义如下:ADT Stack ADT Stack 数据对象:数据对象:D=aD=ai i|a|ai iElemSetElemSet,i=1,2i=1,2n n,n0n0 数据关系:数据关系:R=aR=|a|ai-
4、1i-1,a ai iDD,i=2,3,i=2,3,n,n 基本操作:基本操作:InitStack(&s)InitStack(&s)操作结果:构造一个空栈操作结果:构造一个空栈s s。DestroyStack(&s)DestroyStack(&s)操作结果:栈操作结果:栈s s被销毁。被销毁。ClearStack(&s)ClearStack(&s)操作结果:将操作结果:将s s清为空栈。清为空栈。二、抽象数据类型栈的定义3.13.1栈栈第5页/共93页StackEmpty(s)StackEmpty(s)操作结果:若操作结果:若s s为空栈,则返回为空栈,则返回TRUETRUE,否则,否则FAL
5、SEFALSE。StackLength(s)StackLength(s)操作结果:返回操作结果:返回s s的元素个数,即栈的长度。的元素个数,即栈的长度。GetTop(s,&e)GetTop(s,&e)操作结果:用操作结果:用e e返回返回s s的栈顶元素。的栈顶元素。Push(&s,e)Push(&s,e)操作结果:插入元素操作结果:插入元素e e为新的栈顶元素。为新的栈顶元素。Pop(&s,&e)Pop(&s,&e)操作结果:删除操作结果:删除s s的栈顶元素,并用的栈顶元素,并用e e返回其值返回其值。StackTrasverse(s,visit()StackTrasverse(s,vi
6、sit()操作结果:从栈底到栈顶依次对操作结果:从栈底到栈顶依次对s s的每个数据元素调用的每个数据元素调用 函数函数visit()visit()。一旦。一旦visit()visit()失败,则操作失效。失败,则操作失效。ADT StackADT Stack二、抽象数据类型栈的定义3.13.1栈栈第6页/共93页两种存储表示方式:两种存储表示方式:顺序存储和链式存储顺序存储和链式存储。1.1.栈的顺序存储及其基本操作的实现栈的顺序存储及其基本操作的实现 (1)(1)栈栈的的顺顺序序存存储储是是利利用用一一块块连连续续的的存存储储单单元元依依次次存存放放栈栈中中的的数数据据元元素素,并并附附一个
7、指针一个指针toptop指示当前指示当前栈顶栈顶。采用顺序存储方式存储的栈称为采用顺序存储方式存储的栈称为顺序栈顺序栈。(2)C(2)C语言描述顺序栈:语言描述顺序栈:用一维数组和一个栈顶指针用一维数组和一个栈顶指针Typedef struct Typedef struct elemtype stackMaxSize;elemtype stackMaxSize;int top;int top;stacktype;stacktype;43210-1空栈topatopbctop三、栈的表示和实现3.13.1栈栈第7页/共93页用一个栈顶指针和一个栈底指针以及一个初始的存储空间用一个栈顶指针和一个栈
8、底指针以及一个初始的存储空间#define STACK_INIT_SIZE 100#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define STACKINCREMENT 10typedef structtypedef struct selemtype*base;selemtype*base;selemtype*top;selemtype*top;int stacksize;int stacksize;sqstack;sqstack;连续的存储空间连续的存储空间 栈顶指针指示栈顶元素当前位置栈顶指针指示栈顶元素当前位置(用栈顶指针动态
9、地反映栈中元素的变化情况用栈顶指针动态地反映栈中元素的变化情况)basetop空栈baseatoptopb三、栈的表示和实现3.13.1栈栈第8页/共93页(3)(3)基本操作的算法基本操作的算法 用一维数组和一个栈顶指针用一维数组和一个栈顶指针A A定义一个栈定义一个栈设设栈栈中中数数据据类类型型为为整整型型,用用stackstack数数组组存存放放栈栈中中数数据据元元素素,定定义义一一个个栈栈类类型型stacktypestacktype:typedef int elemtype;typedef int elemtype;#define MaxSize 100;#define MaxSize
10、 100;Typedef struct Typedef struct elemtype stackMaxSize;elemtype stackMaxSize;int top;int top;stacktype;stacktype;三、栈的表示和实现3.13.1栈栈第9页/共93页B B初始化栈:初始化栈:initstack(s)initstack(s)建立一个空栈建立一个空栈s s,实际上是将栈顶指针指向,实际上是将栈顶指针指向-1-1。Void initstack(stacktype*s)Void initstack(stacktype*s)s-top=-1;s-top=-1;C C判断栈是
11、否为空栈:判断栈是否为空栈:stackempty(s)stackempty(s)若栈若栈s s为空则返回为空则返回1 1,否则返回,否则返回0 0。Int stackempty(stacktype*s)Int stackempty(stacktype*s)if(s-top=-1)return(1);if(s-top=-1)return(1);else return(0);else return(0);top空栈三、栈的表示和实现3.13.1栈栈第10页/共93页D D进栈:进栈:push(s,x)push(s,x)将将元元素素x x 插插入入到到栈栈s s中中。若若栈栈满满则则显显示示相相应应
12、信信息息,否否则则指指针针toptop增增1 1,将将x x送入栈顶指针所在位置。送入栈顶指针所在位置。Void push(stacktype*s,elemtype x)Void push(stacktype*s,elemtype x)if(s-top=MaxSize-1)if(s-top=MaxSize-1)printf(printf(“stack overflownstack overflown”););else else s-top+;s-stacks-top=x;s-top+;s-stacks-top=x;三、栈的表示和实现3.13.1栈栈第11页/共93页E E出栈:出栈:pop(s
13、)pop(s)从从栈栈中中删删除除栈栈顶顶元元素素。若若栈栈空空则则显显示示相相应应信信息息,否否则则栈栈指指针针减减1 1,即即栈顶为下一个元素的位置。栈顶为下一个元素的位置。elemtype pop(stacktype*s)elemtype pop(stacktype*s)elemtype e;elemtype e;if(s-top=-1)printf(if(s-top=-1)printf(“stack underflownstack underflown”););else e=s-stacks-top;s-top-;else e=s-stacks-top;s-top-;return e;
14、return e;三、栈的表示和实现3.13.1栈栈第12页/共93页toptopatopbtopcabtopc进栈出栈ctopebtop三、栈的表示和实现3.13.1栈栈第13页/共93页F F取栈顶元素:取栈顶元素:gettop(s)gettop(s)若若栈栈为为空空则则显显示示相相应应信信息息,否否则则返返回回栈栈顶顶元元素素,保保持持栈栈顶顶指指针针不不变变。注意:与弹出操作的区别注意:与弹出操作的区别Elemtype gettop(stacktype*s)Elemtype gettop(stacktype*s)if(s-top=-1)printf(if(s-top=-1)printf
15、(“stack emptynstack emptyn”););else return(s-stacks-top);else return(s-stacks-top);G.G.显示栈中元素:显示栈中元素:display(s)display(s)void display(stacktype*s)void display(stacktype*s)int i;int i;printf(printf(“stack data:stack data:”)for(i=s-top;i=0,i-)for(i=s-top;i=0,i-)printf(printf(“%d%d”,s-stacki);,s-stacki
16、);printf(printf(“nn”););三、栈的表示和实现3.13.1栈栈第14页/共93页用一个栈顶指针和一个栈底指针以及一个初始的存储空间用一个栈顶指针和一个栈底指针以及一个初始的存储空间A.A.定义一个栈定义一个栈#define STACK_INIT_SIZE 100#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define STACKINCREMENT 10typedef structtypedef struct selemtype*base;/selemtype*base;/栈底指针栈底指针 selemtype*to
17、p;/selemtype*top;/栈顶指针栈顶指针 int stacksize;/int stacksize;/当前已分配存储空间,元素个数当前已分配存储空间,元素个数 sqstack;sqstack;三、栈的表示和实现3.13.1栈栈第15页/共93页B.初始化栈:initstack(s)构造一个空栈s,即s.top=s.basevoidinitstack(sqstack*s)s-base=(selemtype*(malloc(stack_inti_size*sizeof(selemtype);if(!s-base)printf(“fail!n”);elses-top=s-base;s-s
18、tacksize=stack_init_size;三、栈的表示和实现3.13.1栈栈第16页/共93页C C判断栈是否为空栈:判断栈是否为空栈:stackempty(s)stackempty(s)若栈若栈s s为空则返回为空则返回1 1,否则返回,否则返回0 0。Int stackempty(sqstack*s)Int stackempty(sqstack*s)if(if(s-top=s-bases-top=s-base)return(1);)return(1);else return(0);else return(0);D.D.取栈顶元素:取栈顶元素:gettop(s)gettop(s)若栈
19、为空则显示相应信息,否则返回栈顶元素,保持栈顶指针不变。若栈为空则显示相应信息,否则返回栈顶元素,保持栈顶指针不变。selemtype gettop(sqstack*s)selemtype gettop(sqstack*s)if(s-top=s-base)printf(if(s-top=s-base)printf(“stack emptynstack emptyn”););else return(*(s-top-1);else return(*(s-top-1);三、栈的表示和实现3.13.1栈栈第17页/共93页E.E.进栈:进栈:push(s,x)push(s,x)将将元元素素x x 插插
20、入入到到栈栈s s中中。若若栈栈满满则则追追加加存存储储空空间间,否否则则将将x x送送入入栈栈顶顶,指指针针toptop增增1 1。Voidpush(sqstack*s,elemtypex)if(s-top-s-base=s-stacksize)s-base=(selemtype*)realloc(sbase,(s.stacksize+STACKINCREMENT)*sizeof(selemtype);s-top=s-base+s-stacksize;s-stacksize+=STACKINCREMENT;*s-top+=x;/栈满的判断/重新定义栈空间/新栈顶/进栈三、栈的表示和实现3.1
21、3.1栈栈第18页/共93页F.F.出栈:出栈:pop(s)pop(s)从从栈栈中中删删除除栈栈顶顶元元素素。若若栈栈空空则则显显示示相相应应信信息息,否否则则栈栈指指针针减减1 1,即栈顶为下一个元素的位置。即栈顶为下一个元素的位置。selemtypepop(stacktype*s)selemtypee;if(s-top=s-base)printf(“stackunderflown”);elses-top-;e=*s-top;returne;三、栈的表示和实现3.13.1栈栈第19页/共93页2.2.栈的链式存储方式栈的链式存储方式 采用链式存储的栈称为采用链式存储的栈称为链栈链栈。链栈的特
22、点:链栈的特点:(1)(1)不存在栈满上溢的情况,是一种特殊的单链表。不存在栈满上溢的情况,是一种特殊的单链表。(2)(2)链栈是动态存储结构,无需预先分配存储空间,因此节省存储空间。链栈是动态存储结构,无需预先分配存储空间,因此节省存储空间。(3)(3)入栈时,先申请一个结点的存储空间,然后修改栈顶指针。入栈时,先申请一个结点的存储空间,然后修改栈顶指针。(4)(4)出栈时,同样也是将栈顶的后继结点做为栈顶。出栈时,同样也是将栈顶的后继结点做为栈顶。三、栈的表示和实现3.13.1栈栈第20页/共93页(1)(1)链栈结点类型的定义:链栈结点类型的定义:typedef struct nodet
23、ypedef struct node elemtype data;elemtype data;struct node*next;struct node*next;node;node;(2)(2)初始化栈初始化栈void initstack(node*top)void initstack(node*top)top=NULL;top=NULL;栈底a1an-1an栈顶topdatanextNULLtop空栈相当于链表的head三、栈的表示和实现3.13.1栈栈第21页/共93页(3)入栈voidpush(node*top,elemtypee)node*p;p=(node*)malloc(sizeo
24、f(node);p-data=e;p-next=top;top=p;(4)出栈elemtypepop(node*top)node*q;elemtype*pif(top!=NULL)q=top;*p=top-data;top=top-next;free(q);return(*p);三、栈的表示和实现3.13.1栈栈第22页/共93页3.2栈的应用举例一、数制转换一、数制转换二、表达式求值二、表达式求值三、括号匹配的检验三、括号匹配的检验四、迷宫求解四、迷宫求解五、递归的实现五、递归的实现第23页/共93页 由十进制由十进制N N向其它进制向其它进制d d的转换是计算机实现计算的基本问题,基于原理
25、:的转换是计算机实现计算的基本问题,基于原理:N=(N div d)*d+N mod dN=(N div d)*d+N mod d其中:其中:divdiv为整除运算,为整除运算,mod mod 为取余运算。为取余运算。一个十进制数转换成其它进制数:一个十进制数转换成其它进制数:N N除除d d取余,取余,先余为低,后余为高先余为低,后余为高。如:如:(1348)(1348)1010=(2504)=(2504)8 8 13481688888212040521348mod8低高一、数制转换3.23.2栈栈的的应应用用举举例例第24页/共93页算法分析:算法分析:由由十十进进制制转转换换为为其其他他
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第三
限制150内