数据结构讲义3概况课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构讲义3概况课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 讲义 概况 课件
- 资源描述:
-
1、2022-11-111柳 青Email:School of Software,Yunnan University 数据结构数据结构(Data Structure)2022-11-1123.1、栈、栈(Stack)(Stack)3.2、栈的应用举例、栈的应用举例3.3、栈与递归的实现、栈与递归的实现3.4、队、队(Queue)(Queue)第三章第三章 栈和队列栈和队列2022-11-1133.1 3.1 栈栈 (Stack)(Stack)3.1.1 3.1.1 定义定义栈栈(Stack):限定仅只能在表尾:限定仅只能在表尾端进行插入和删除的线性表。端进行插入和删除的线性表。栈顶栈顶(top):
2、表尾端被称之为栈表尾端被称之为栈顶。栈顶之上为顶。栈顶之上为top指针。指针。栈底栈底(Bottom):和表尾相对应的和表尾相对应的另一端,称之为栈底。另一端,称之为栈底。特点:特点:后进先出(后进先出(LIFO)。)。a1 a2 an-1 antop栈顶栈顶 Base 栈底栈底2022-11-1143.1 3.1 栈栈 (Stack)(Stack)v栈的抽象数据类型定义:栈的抽象数据类型定义:ADT Stack 数据对象数据对象:D=ai|aiElemSet,i=1,2,n,n0 数据关系数据关系:R1=|ai-1,ai D,i=2,n 约定约定an端为栈顶,端为栈顶,a1端为栈底。端为栈底
3、。基本操作基本操作:InitStack(&S)/初始化,构造一个空栈初始化,构造一个空栈S。Push(&S,e)/将将 e 插入栈顶,插入栈顶,必须判必须判断断栈是否溢出栈是否溢出,top上移上移。Pop(&S,&e)/删除非空栈删除非空栈S的的栈顶元素至变量栈顶元素至变量e,top下移下移。GetTop(S,&e)/取非空栈取非空栈S的的栈顶元素至变量栈顶元素至变量e,top不变不变。StackLength(S)/返回栈返回栈S的元素个数,即栈的长度。的元素个数,即栈的长度。StackEmpty(S)/若栈若栈S的为空,则返回的为空,则返回TRUE,否则返回,否则返回FALSE。ADT St
4、ack2022-11-115basetoptopAbaseABCtopbasetopbaseABCD注意:因为注意:因为 base=top 是栈空标志,是栈空标志,所以所以 top 指针只能指示真正的栈指针只能指示真正的栈 顶元素之上的数组元素的下标地顶元素之上的数组元素的下标地 址。否则造成矛盾。址。否则造成矛盾。栈满时的处理方法:栈满时的处理方法:1、提示出错,返回操作系统。、提示出错,返回操作系统。2、分配更大的空间。、分配更大的空间。31203.1.2 3.1.2 栈的顺序存储结构栈的顺序存储结构(即即顺序栈顺序栈)的表示和实现的表示和实现Typedef struct SElemTyp
5、e *base;SElemType *top;int stacksize;SqStack;3.1 3.1 栈栈2022-11-116#define STACK_INIT_SIZE 100;#define STACK_INCREMENT 10;Status InitStack(SqStack&S)S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType);if(!S.base)exit(OVERFLOW);S.top=s.base;/空栈标志空栈标志 S.stacksize=STACK_INIT_SIZE;return OK;/Init
6、Stack;012 STACK_INIT_SIZE-1s.base数组数组 s.base0,s.base1,s.baseSTACK_INIT_SIZE-1 1.顺序栈的初始化实现:顺序栈的初始化实现:3.1 3.1 栈栈2022-11-117Status Push(SqStack&s,SElemType e)If(s.top-s.base=s.stacksize)s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType);if(!s.base)exit(OVERFLOW);s.top=s.ba
7、se+s.stacksize;s.stacksize +=STACKINCREMENT;*s.top+=e;/相当于:相当于:*s.top=e;s.top+两条指令两条指令;return OK;/Push;2.顺序栈的顺序栈的 Push 操作实现:操作实现:3.1 3.1 栈栈2022-11-118函数函数realloc(ptr,size):将将 ptr 指向的存区长指向的存区长度改变为度改变为 size,size 比原先大,必须进行移比原先大,必须进行移动,且返回指向新存区的指针。动,且返回指向新存区的指针。0 1 2 97 98 99ptr0 1 2 98 99 107108 109 pt
8、r3.1 3.1 栈栈2022-11-1193.1 3.1 栈栈 3.顺序栈的顺序栈的 Pop 操作操作实现:实现:若栈若栈S不空,则删除其栈顶元素,用不空,则删除其栈顶元素,用e返回该值;返回该值;否则返回否则返回ERROR。Status Pop(SqStack&s,SElemType&e)If(s.top=s.base)return ERROR;s.top-;e=*s.top /此2句可缩写为 e=*-s.top return OK;/Pop2022-11-1110 data next 栈顶栈顶栈底栈底Stypedef struct Snode SElemType data;struct
9、Snode *next;Snode,*Stackptr;Stackptr S;/S为栈顶指针为栈顶指针InitlinkStack(Stackptr&S)S=NULL /InitlinkStack;S3.1.3 3.1.3 链式链式栈的表示和实现栈的表示和实现1.链式栈的初始化实现:链式栈的初始化实现:3.1 3.1 栈栈2022-11-1111 data next 栈顶栈顶 栈底栈底SStatus Push(Stackptr&s,SElemType e)p=(Stackptr)malloc(sizeof(Snode);if(!p)exit(OVERFLOW);p-data=e;p-next=s
10、;s=p;return OK;/Push;data nextpS data next2.链式栈的链式栈的 Push 操作实现操作实现3.1 3.1 栈栈2022-11-1112 data nextpeS data next2.链式栈的链式栈的 Push 操作实现操作实现 data next 栈顶栈顶 栈底栈底SStatus Push(Stackptr&s,SElemType e)p=(Stackptr)malloc(sizeof(Snode);if(!p)exit(OVERFLOW);p-data=e;p-next=s;s=p;return OK;/Push;3.1 3.1 栈栈2022-11
11、-1113 data nextp data nextSe2.链式栈的链式栈的 Push 操作实现操作实现3.1 3.1 栈栈 data next 栈顶栈顶 栈底栈底SStatus Push(Stackptr&s,SElemType e)p=(Stackptr)malloc(sizeof(Snode);if(!p)exit(OVERFLOW);p-data=e;p-next=s;s=p;return OK;/Push;2022-11-1114 data nextp data nexteS2.链式栈的链式栈的 Push 操作实现操作实现3.1 3.1 栈栈 data next 栈顶栈顶 栈底栈底S
12、Status Push(Stackptr&s,SElemType e)p=(Stackptr)malloc(sizeof(Snode);if(!p)exit(OVERFLOW);p-data=e;p-next=s;s=p;return OK;/Push;2022-11-1115 data next 栈顶栈顶 栈底栈底SStatus Pop(Stackptr&s,SElemType&e)if(!s)return(ERROR);e=s-data;p=s;s=s-next;free(p);return OK;/Pop;data nextSA3.链式栈的链式栈的 Pop 操作实现操作实现3.1 3.1
13、 栈栈2022-11-1116 data nextSpe=AA3.链式栈的链式栈的 Pop 操作实现操作实现3.1 3.1 栈栈 data next 栈顶栈顶 栈底栈底SStatus Pop(Stackptr&s,SElemType&e)if(!s)exit(UNDERFLOW);e=s-data;p=s;s=s-next;free(p);return OK;/Pop;2022-11-1117 data nextSp3.链式栈的链式栈的 Pop 操作实现操作实现3.1 3.1 栈栈 data next 栈顶栈顶 栈底栈底SStatus Pop(Stackptr&s,SElemType&e)if
14、(!s)exit(UNDERFLOW);e=s-data;p=s;s=s-next;free(p);return OK;/Pop;2022-11-1118 data nextS3.链式栈的链式栈的 Pop 操作实现操作实现3.1 3.1 栈栈 data next 栈顶栈顶 栈底栈底SStatus Pop(Stackptr&s,SElemType&e)if(!s)exit(UNDERFLOW);e=s-data;p=s;/p须先定义 s=s-next;free(p);return OK;/Pop;2022-11-1119例如例如10 进制和进制和 8 进制之间的数的转换。进制之间的数的转换。(1
15、348)10 =83*a3+82*a2+8*a1+80*a0 =(2504)8 n n div 8 n mod 8 1348 168 4 168 21 0 21 2 5 2 0 240523.2 3.2 栈的应用栈的应用3.2.1 3.2.1 数制转换数制转换公式:公式:N=(n div d)*d+n mod d (div(div为整除运算为整除运算,mod,mod为求余运算为求余运算)void conversion()InitStack(S);scanf(“%d”,&N);while(N)Push(S,N%8);N=N/8;while(!StackEmpty(S)Pop(S,e);print
展开阅读全文