数据结构 第3章.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构 第3章.ppt》由会员分享,可在线阅读,更多相关《数据结构 第3章.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构数据结构第第3章章【学习目标】【学习目标】1.掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。问题中正确选用它们。2.2.熟练掌握栈类型的两种实现方法。熟练掌握栈类型的两种实现方法。3.3.熟练掌握循环队列和链队列的基本操作实现算法。熟练掌握循环队列和链队列的基本操作实现算法。4.4.理解递归算法执行过程中栈的状态变化过程。理解递归算法执行过程中栈的状态变化过程。【知识点】【知识点】顺序栈、链栈、循环队列、链队列顺序栈、链栈、循环队列、链队列注意它们的基本操作实现时的特殊情况,如栈满和栈空、注意它们的基本操
2、作实现时的特殊情况,如栈满和栈空、队满和队空的条件以及它们的描述方法队满和队空的条件以及它们的描述方法。【学习指南】【学习指南】1数据结构 栈栈和和队列队列是在程序设计中被广泛使用的两种线性数是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,据结构,它们的特点在于基本操作的特殊性,栈必须按栈必须按后进先出后进先出的规则进行操作的规则进行操作,而,而队列必须按队列必须按先进先出先进先出的规则进行操作的规则进行操作。和线性表相比,它们的插入和删除操。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。作受更多的约束和限定,故又称为限定性的线性
3、表结构。和线性表相比,从和线性表相比,从数据结构数据结构的角度看,它们都的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是同外,主要区别是对插入和删除操作的对插入和删除操作的限定限定。2数据结构 线性表:线性表:Insert(L,i,x)Delete(L,i)(1in+1)(1in)栈:栈:Insert(L,n+1,x)Delete(L,n)队列:队列:Insert(L,n+1,x)Delete(L,1)插插入入删删除除线性表允许
4、在表内任一位置进行插入和删除;线性表允许在表内任一位置进行插入和删除;栈只允许在表尾一端进行插入和删除;栈只允许在表尾一端进行插入和删除;队列只允许在表尾一端进行插入,在表头一端进行删队列只允许在表尾一端进行插入,在表头一端进行删除。除。3数据结构栈和队列是两种特殊的线性结构,特点:栈和队列是两种特殊的线性结构,特点:栈:栈:后进先出后进先出 如铁路调度站如铁路调度站队列:先进先出队列:先进先出 如购物排队问题如购物排队问题栈顶栈顶栈底栈底队尾队尾队首队首4数据结构3.1.1栈的类型定义栈的类型定义 栈(栈(Stack)是限定只能在表的一端进行插入和删除操作的是限定只能在表的一端进行插入和删除
5、操作的线性表。在表中,允许插入和删除的一端称作线性表。在表中,允许插入和删除的一端称作栈顶栈顶(top),不,不允许插入和删除的另一端称作允许插入和删除的另一端称作栈底栈底(bottom)。通常称通常称往栈顶插入元素的操作为往栈顶插入元素的操作为入栈入栈,称,称删除栈顶元素的操作为删除栈顶元素的操作为出栈出栈。因为后入栈的元素先于先入。因为后入栈的元素先于先入栈的元素出栈,故被称为是一种栈的元素出栈,故被称为是一种后后进先出进先出的结构,因此又称的结构,因此又称LIFO(LastInFirstOut的缩写)表的缩写)表如左图所示的铁路调度站表示栈的特点如左图所示的铁路调度站表示栈的特点 5数据
6、结构类型定义如下类型定义如下:ADTStack数据数据对对象:象:Dai|ai ElemSet,i=1,2,.,n,n0数据关系:数据关系:R1|ai-1,ai D,i=2,.,n约定约定an端为栈顶,端为栈顶,a1端为栈底端为栈底。基本操作:基本操作:InitStack(&S)构造一个空栈构造一个空栈S。DestroyStack(&S)初始条件:栈初始条件:栈S已存在。操作结果:栈已存在。操作结果:栈S被销毁。被销毁。ClearStack(&S)初始条件:栈初始条件:栈S已存在。操作结果:将已存在。操作结果:将S清为空栈。清为空栈。StackEmpty(S)判空,通常以它作为循环结束的条件判
7、空,通常以它作为循环结束的条件GetTop(S,&e)取栈顶元素,只以取栈顶元素,只以e返回栈顶元素,并不从栈中删除返回栈顶元素,并不从栈中删除Push(&S,e)入栈操作入栈操作Pop(&S,&e)出栈操作,不仅以出栈操作,不仅以e返回栈顶元素,并将它从栈中删除。返回栈顶元素,并将它从栈中删除。ADTStack6数据结构3.1.2栈的存储表示和操作的实现栈的存储表示和操作的实现一、顺序栈类型的定义一、顺序栈类型的定义和线性表类似,栈也有两种存储表示,其顺序存储结构简称为和线性表类似,栈也有两种存储表示,其顺序存储结构简称为顺序栈。顺序栈。和顺序表类似,对顺序栈也需要事先为它分配一个可以容纳最
8、和顺序表类似,对顺序栈也需要事先为它分配一个可以容纳最多元素的存储空间,多元素的存储空间,base为这个存储空间的基地址,也即一维为这个存储空间的基地址,也即一维数组的地址。数组的地址。从名称来讲,从名称来讲,“栈顶指针栈顶指针”意为指示栈顶元素在栈中的位置,但意为指示栈顶元素在栈中的位置,但它的值实际是栈中元素的个数,和顺序表中的它的值实际是栈中元素的个数,和顺序表中的length值的意义值的意义相同。相同。为了应用方便,这个为了应用方便,这个最大空间的容量最大空间的容量应由使用这个顺序栈的应由使用这个顺序栈的程序员决定,它的默认值和顺序表的默认值相同。程序员决定,它的默认值和顺序表的默认值
9、相同。7数据结构顺序栈的结构顺序栈的结构top指向压栈时下一个元素将要存放的位置。指向压栈时下一个元素将要存放的位置。出栈时出栈时top减一指向弹栈时下一个元素的取值位置。减一指向弹栈时下一个元素的取值位置。栈空的条件:栈空的条件:top=base栈满的条件:栈满的条件:top-base=stacksizetoptopbase空栈空栈basetopABCABCbase满栈满栈DE栈的表示和实现栈的表示和实现非空非满栈非空非满栈8数据结构顺序表示顺序表示#define STACK_INIT_SIZE 100;#define STACKINCREMENT 10;typedef struct SEl
10、emType*base;SElemType *top;int stacksize;SqStack;其中其中stacksize表示栈当前可以使用的最大容量。表示栈当前可以使用的最大容量。Base为栈底,为栈底,Top为栈顶。栈顶指针指向栈顶元素为栈顶。栈顶指针指向栈顶元素的下一个位置(即下次压栈时元素所放的位置)的下一个位置(即下次压栈时元素所放的位置)9数据结构基本操作的实现基本操作的实现:初始化栈初始化栈 Status InitStack(SqStack&S)/构造一个空栈构造一个空栈 S.base=(SElemType*)malloc (STACK_INIT_SIZE*sizeof(SEl
11、emType);if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/InitStack10数据结构压栈压栈:Status Push(SqStack&S,SElemType e)/元素元素e插入到栈中,成为新的栈顶插入到栈中,成为新的栈顶 if(S.top-S.base=S.stacksize)/栈满栈满 S.base=(SElemType*)realloc (S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType);if(!S.base)ex
12、it(OVERFLOW);S.top =S.base+S.stacksize;S.stacksize+=STACKINCREMENT;/if *S.top+=e;return OK;/Push11数据结构弹栈弹栈:Status Pop(SqStack&S,SElemType&e)/从栈顶读取数据放入从栈顶读取数据放入e内,栈中下一元素所内,栈中下一元素所 /在位置成为新的栈顶在位置成为新的栈顶 if(S.top=S.base)return ERROR;/栈空栈空 e=*-S.top;return OK;/Pop 注意注意top的操作顺序和值的变化。的操作顺序和值的变化。压栈:压栈:valuet
13、op;top+;弹栈:弹栈:top-;top-value;12数据结构Status GetTop(SqStack S,SElemType&e)if(S.top=S.base)return ERROR;e=*(S.top-1);return OK;思考:语句思考:语句e=*(S.top-1);改为改为e=*(-S.top);是否正是否正确?确?13数据结构二、链栈二、链栈链栈即为栈的链式存储结构。链栈即为栈的链式存储结构。链栈的定义更简单,结点结构链栈的定义更简单,结点结构和单链表中的结点结构相同,和单链表中的结点结构相同,无须重复定义。注意无须重复定义。注意链栈中指链栈中指针的方向是从栈顶指向
14、栈底的,针的方向是从栈顶指向栈底的,这正好和单链表是相反的。这正好和单链表是相反的。14数据结构能否将链栈中的指针方向反过来,从栈底到栈顶?能否将链栈中的指针方向反过来,从栈底到栈顶?不行不行,如果反过来的话,删除栈顶元素时,为修改其,如果反过来的话,删除栈顶元素时,为修改其前驱指针,需要从栈底一直找到栈顶。前驱指针,需要从栈底一直找到栈顶。因为链栈的操作是线形表链式存储结构的特例,因因为链栈的操作是线形表链式存储结构的特例,因此,相关操作可以自己总结出来。此,相关操作可以自己总结出来。15数据结构压栈的处理:压栈的处理:p=malloc(Lnode);p-next=s-next;s-next
15、=p;弹栈的处理弹栈的处理:p=s-next;s-next=s-next-next;spp栈的链式表示:栈的链式表示:假设以首结点作为栈顶,链带有头结点。假设以首结点作为栈顶,链带有头结点。16数据结构补充:一种新的栈的类型定义#define StackSize 100 typedef char datatype;typedef struct datatype datastacksize;int top;seqstack;SeqStack*s;思考:如何判断空栈和满栈思考:如何判断空栈和满栈17数据结构top6 5 4 3 2 1 0 -1思考:如何判断空栈和满栈思考:如何判断空栈和满栈18数
16、据结构 设设S S是是SeqStackSeqStack类型的指针变量。若栈底类型的指针变量。若栈底位置在向量的低端,即位置在向量的低端,即sdata0sdata0是栈底元是栈底元素,那么栈顶指针素,那么栈顶指针stopstop是正向增加的,即是正向增加的,即进栈时需将进栈时需将sstop加加1,退栈时需将,退栈时需将stop 减减1。因此,。因此,stoptop=stacksize-1表示栈满。当栈满时再做进栈运表示栈满。当栈满时再做进栈运算必定产生空间溢出,简称算必定产生空间溢出,简称“上溢上溢”;当栈空时当栈空时再做退栈运算也将产生溢出,简称再做退栈运算也将产生溢出,简称“下溢下溢”。19
17、数据结构3.2、栈的应用举例、栈的应用举例 3.2.1数制转换数制转换 由于栈的操作具有后进先出的固有特性,致使栈成为程序由于栈的操作具有后进先出的固有特性,致使栈成为程序设计中的有用工具。反之,凡应用问题求解的过程具有设计中的有用工具。反之,凡应用问题求解的过程具有后进后进先出先出的天然特性的话,则求解的算法中也必然需要利用的天然特性的话,则求解的算法中也必然需要利用栈栈。十进制数十进制数N和其他和其他d进制数的转换是计算机实现计算的基本问题,进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:其解决方法很多,其中一个简单算法基于下列原理:N=(Ndivd)
18、d+Nmodd(其中:其中:div为整除运算,为整除运算,mod为求余运算为求余运算)例如:例如:(1348)10=(2504)8 N N div 8 N%8 1348 168 4 168 21 0 21 2 5 2 0 2 20数据结构假设现要编制一个满足下列要求的程序:对假设现要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数,打印输于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。出与其等值的八进制数。八进制的各个数位产生的顺序是从低位到高八进制的各个数位产生的顺序是从低位到高位的,而打印输出的顺序,一般来说应从高位的,而打印输出的顺序,一般来说应从高位到低位,这恰
19、好和计算过程相反。位到低位,这恰好和计算过程相反。21数据结构voidconversion()/对于输入的任意一个非负十进制整数,打印输出与其等值的八进对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数制数InitStack(S);/构造空栈构造空栈scanf(“%d”,N)/输入一个十进制数输入一个十进制数while(N)Push(S,N%8);/“余数余数”入栈入栈N=N/8;/非零非零“商商”继续运算继续运算/whilewhile(!StackEmpty)/和和“求余求余”所得相逆的顺序输出八进制的各位数所得相逆的顺序输出八进制的各位数Pop(S,e);printf(“%d”,
20、e);/while/conversion22数据结构2.括号匹配算法括号匹配算法 ()的配对问题。()的配对问题。(5+(2-6)+10)+6*2 (5+(2-6)+10+6)*2 (5+2-6)+10)+6)*2 判断的标准:判断的标准:方法:见到左括号压栈,方法:见到左括号压栈,见到右括号弹栈,并和弹出的数见到右括号弹栈,并和弹出的数 据配对。据配对。课堂练习:课堂练习:假设表达式结束符为假设表达式结束符为#,试写出其算法试写出其算法23数据结构int MatchJudge()/匹配返回匹配返回1,不匹配返回,不匹配返回0 InitStack(S);scanf(“%c”,&ch);whil
21、e(ch!=#)if (ch=(|ch=|ch=)push(s,ch);if (ch=))pop(s,e);if(e()return 0;if (ch=)pop(s,e);if(e)return 0;if (ch=)pop(s,e);if(e“”)return 0;scanf(“%c”,&ch);/while if (StackEmpty(s)return 1 else return 0;/MatchJudge24数据结构3.2.3 行编辑程序行编辑程序在编辑程序中,设立一个输入缓冲区,用于接受用户在编辑程序中,设立一个输入缓冲区,用于接受用户输入的一行字符,然后逐行存入用户数据区。允许用输入
22、的一行字符,然后逐行存入用户数据区。允许用户输入错误,并在发现有误时可以及时更正。户输入错误,并在发现有误时可以及时更正。字符字符“#”为删节符,删除左边一个可见字符。字符为删节符,删除左边一个可见字符。字符“”为删行符,删除当前一行。用栈来处理一行,一行结为删行符,删除当前一行。用栈来处理一行,一行结束即用户输入束即用户输入n。例如:例如:用户输入:用户输入:whli#ilr#e(s#*s)outchaputchar(*s=#+);则实际有效为:则实际有效为:while(*s)putchar(*s+);25数据结构void LineEdit()Initstack(S);ch=getchar(
23、);while(ch!=EOF)while(ch!=EOF&ch!=n)switch(ch)case#:Pop(s,c);case :Clearstack(s);default:Push(S,ch);ch=getchar();ClearStack(s);if(ch!=eof)ch=gethar();DestroyStack(s);26数据结构3.2.5表达式求值:表达式求值:任何一个表达式都是由任何一个表达式都是由操作数操作数(operand)、运算符、运算符(operator)和界限符和界限符(delimiter)组成,其中,操作数可以组成,其中,操作数可以是常数也可以是被说明为变量或常量的
24、标识符;运算符可是常数也可以是被说明为变量或常量的标识符;运算符可以分为算术运算符、关系运算符和逻辑运算符等三类;基以分为算术运算符、关系运算符和逻辑运算符等三类;基本界限符有左右括弧和表达式结束符等。为了叙述简洁,本界限符有左右括弧和表达式结束符等。为了叙述简洁,在此仅限于讨论只含二元运算符的算术表达式。可将这种在此仅限于讨论只含二元运算符的算术表达式。可将这种表达式定义为:表达式定义为:表达式表达式=操作数操作数运算符运算符操作数操作数操作数操作数=简单变量简单变量|表达式表达式简单变量简单变量=标识符标识符|无符号整数无符号整数算术运算的规则算术运算的规则是:是:先乘除后加减、先左后右和
25、先括弧内后先乘除后加减、先左后右和先括弧内后括弧外括弧外。则对表达式进行运算不能按其中运算符出现的先后。则对表达式进行运算不能按其中运算符出现的先后次序进行次序进行27数据结构算符优先算法:利用运算优先关系的规定来实算符优先算法:利用运算优先关系的规定来实 现对表达式的编译或解释执行。现对表达式的编译或解释执行。表达式的组成:操作数表达式的组成:操作数+算符(操作符算符(操作符+界限符)界限符)算符优先关系算符优先关系 +_*/()#+_*/(#=28数据结构算符优先算法的实现算符优先算法的实现1)置操作数栈为空栈,表达式起始符为运算符栈的)置操作数栈为空栈,表达式起始符为运算符栈的栈底。栈底
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第3章
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内