数据结构 第三章栈和队列.ppt
《数据结构 第三章栈和队列.ppt》由会员分享,可在线阅读,更多相关《数据结构 第三章栈和队列.ppt(80页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章第三章栈和队列栈和队列n教学目的教学目的n通过本章的学习,要求掌握栈和队列的定义,通过本章的学习,要求掌握栈和队列的定义,熟练掌握顺序和链接存储的栈和队列的算法设熟练掌握顺序和链接存储的栈和队列的算法设计及其程序实现,了解栈和队的各种应用。计及其程序实现,了解栈和队的各种应用。n本章主要介绍以下内容:本章主要介绍以下内容:l栈的概念、存储结构及其基本操作栈的概念、存储结构及其基本操作l队列的概念、存储结构及其基本操作队列的概念、存储结构及其基本操作l栈与队列的应用举例栈与队列的应用举例n重点:栈和队列的定义、特征;顺序栈、链栈重点:栈和队列的定义、特征;顺序栈、链栈的描述及基本操作实现算
2、法;循环队列和链队的描述及基本操作实现算法;循环队列和链队列的基本操作实现算法。列的基本操作实现算法。n难点:栈满、栈空的条件及描述方法;队满和难点:栈满、栈空的条件及描述方法;队满和队空的描述方法;循环队列上的插入、删除操队空的描述方法;循环队列上的插入、删除操作。作。栈(stack)n栈的定义n栈的类型定义n栈的存储方式栈的定义n栈是一种特殊的线性表。其特殊性在于限定插栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在入和删除数据元素的操作只能在线性表的一端线性表的一端进行。进行。a1ana2栈的示意图栈顶栈底进栈出栈进行插入和删除的进行插入和删除的一端是浮动端,被一端是
3、浮动端,被称为栈顶称为栈顶固定端一端被固定端一端被称为栈底称为栈底假设栈假设栈S=(a1,a2,a3,an),则,则a1称为栈底称为栈底元素,元素,an为栈顶元素。栈中元素按为栈顶元素。栈中元素按a1,a2,a3,an的次序进栈,退栈的第一个元素应为栈的次序进栈,退栈的第一个元素应为栈顶元素。顶元素。换句话说,栈的修改是按后进先出的原则进行换句话说,栈的修改是按后进先出的原则进行的。的。因此,栈称为后进先出表(因此,栈称为后进先出表(LIFO)LastInFirstOut。栈的类型定义ADTStack 数据对象数据对象:D=ai|ai ElemSeti=1,2,.,nn0数据关系数据关系:R1
4、=|ai,ai+1 ElemSet,i=1,2,.,n-10约定约定an端为栈顶,端为栈顶,a1端为栈底端为栈底基本操作基本操作:结构初始化结构初始化InitStack(&S)操作结果:构造一个空栈操作结果:构造一个空栈S销毁结构销毁结构DetroyStack(&S)初始条件:栈初始条件:栈S已经存在已经存在操作结果:销毁栈操作结果:销毁栈S引用型操作引用型操作StackEmpty(S)/判断判断S是否为空栈,若为空返回是否为空栈,若为空返回True,否则返回,否则返回FalseStackLength(S)/得到栈得到栈S的元素个数,即栈的长度的元素个数,即栈的长度GetTop(S,&e)/得
5、到得到S的栈顶元素,并将之放入变量的栈顶元素,并将之放入变量e中中StackTraverse(S,visit()/从栈底到栈顶遍历栈从栈底到栈顶遍历栈S,对每个元素调用,对每个元素调用visit()加工型操作加工型操作ClearStack(&S)/清空栈清空栈SPush(&S,e)/向栈中插入元素向栈中插入元素e为新的栈顶元素为新的栈顶元素Pop(&S,&e)/删除栈删除栈S的栈顶元素,并用的栈顶元素,并用e返回值返回值栈的存储方法栈的存储方法n栈有两种存储表示方法栈有两种存储表示方法:顺序存储和链式存储顺序存储和链式存储 由于栈是运算受限的线性表,因此线性表由于栈是运算受限的线性表,因此线性
6、表的存储结构对栈也适应。的存储结构对栈也适应。栈的顺序存储结构简称为栈的顺序存储结构简称为顺序栈顺序栈,它是运,它是运算受限的线性表。因此,可用数组来实现顺序算受限的线性表。因此,可用数组来实现顺序栈。栈。通常由一个一维数组和一个记录栈顶元素通常由一个一维数组和一个记录栈顶元素位置的变量组成。位置的变量组成。当当栈栈中中没没有有数数据据元元素素时时,表表示示为为栈栈空空。栈栈顶顶元元素素所所对对应应的的下下标标值值top=-1。在刚才基础上执行在刚才基础上执行Push(S,A)后得到这种状态后得到这种状态又又有有三三个个元元素素B、C、D先先后后入入栈栈,此此时时栈栈顶顶元元素素的的下下标标值
7、值top=3。栈已满。栈已满。在刚才状态下,执行两次在刚才状态下,执行两次Pop(S,x)运算后得到运算后得到Top-1D01230123Top-A0123Top-ABC0123Top-AB顺序存储结构n n顺序栈的顺序栈的顺序栈的顺序栈的C#C#语言描述如下:语言描述如下:语言描述如下:语言描述如下:publicclassSeqStackpublicclassSeqStackprivateintmaxSize;/privateintmaxSize;/顺序栈的容量顺序栈的容量顺序栈的容量顺序栈的容量privatechardata;/privatechardata;/数组,用于存储顺序栈的数据元
8、素,这里存数组,用于存储顺序栈的数据元素,这里存数组,用于存储顺序栈的数据元素,这里存数组,用于存储顺序栈的数据元素,这里存储的只有字符型储的只有字符型储的只有字符型储的只有字符型privateinttop;/privateinttop;/指示顺序栈的栈顶指示顺序栈的栈顶指示顺序栈的栈顶指示顺序栈的栈顶 n nmaxSizemaxSize 为栈中元素的最大容量。为栈中元素的最大容量。为栈中元素的最大容量。为栈中元素的最大容量。n ndatadata域域域域:为一个一维数组,用于存储栈中元素。为一个一维数组,用于存储栈中元素。为一个一维数组,用于存储栈中元素。为一个一维数组,用于存储栈中元素。n
9、 ntoptop域域域域:栈顶指针。取值范围为栈顶指针。取值范围为栈顶指针。取值范围为栈顶指针。取值范围为0 0MaxSize-1MaxSize-1。n ntop=-1top=-1表示栈空,表示栈空,表示栈空,表示栈空,top=MaxSize-1top=MaxSize-1表示栈满。表示栈满。表示栈满。表示栈满。类的实现类的实现publicclassSeqStackprivateintmaxSize;/顺序栈的容量顺序栈的容量privatechardata;/数组,用于存储顺序栈的数据元素,这数组,用于存储顺序栈的数据元素,这里存储的只有字符型里存储的只有字符型privateinttop;/指示
10、顺序栈的栈顶指示顺序栈的栈顶publicintMaxSize/最大容量属性最大容量属性getreturnmaxSize;setmaxSize=value;publicintTop/栈顶属性栈顶属性getreturntop;使用使用SeqListSeqList s=new s=new SeqListSeqList()()生成一个生成一个SeqListSeqList类的对象实例类的对象实例n栈底元素为栈底元素为n栈顶指针为栈顶指针为n进栈时需将进栈时需将s.tops.top加加1 1,退栈时需将,退栈时需将s.tops.top 减减1 1ns.tops.top00表示空栈,表示空栈,s.tops.
11、top=MaxSize-1=MaxSize-1表示栈表示栈满满s.data0s.top基本操作1.初始化栈初始化栈S/构造函数构造函数publicSeqStack(intsize)data=newcharsize;maxSize=size;top=-1;2.求栈的长度求栈的长度publicintGetLength()returntop+1;3.清空顺序栈清空顺序栈publicvoidClear()top=-1;4、判栈空、判栈空publicboolIsEmpty()if(top=-1)returntrue;elsereturnfalse;5、入栈、入栈publicvoidPush(charit
12、em)if(top=maxSize-1)/若栈已满,则不能再做入栈操作若栈已满,则不能再做入栈操作Console.WriteLine(TheStackisfull!);return;top+;datatop=item;6、出栈出栈publiccharPop()if(IsEmpty()/若栈为空栈,无法做出栈操作若栈为空栈,无法做出栈操作Console.WriteLine(TheStackisempty!);return;charitem=datatop;top-;returnitem;7、取栈顶元素、取栈顶元素publiccharGetTop()if(IsEmpty()Console.Writ
13、eLine(TheStackisemptye!);return;returndatatop;链式存储结构链式存储结构n栈的链式存储结构称为栈的链式存储结构称为链栈链栈,它是运算是受限的单链,它是运算是受限的单链表,可插入和删除操作仅限制在表头位置上进行表,可插入和删除操作仅限制在表头位置上进行.链栈的类型说明如下:链栈的类型说明如下:publicclasspublicclassStackNodeStackNodeprivateintdata;/privateintdata;/数据域数据域数据域数据域privateprivateStackNodeStackNodenext;/next;/指针域指
14、针域指针域指针域 链栈的几种状态链栈的几种状态栈的应用举例栈的应用举例n由于栈结构具有的后进先出的固有特性,致使由于栈结构具有的后进先出的固有特性,致使栈成为程序设计中常用的工具。栈成为程序设计中常用的工具。n数值转换数值转换n括号匹配检验括号匹配检验数值转换数值转换n十进制数值转换成二进制 使用展转相除法将一个十进制数值转换成二进使用展转相除法将一个十进制数值转换成二进制数值。制数值。即用该十进制数值除以即用该十进制数值除以2,并保留其余数;重,并保留其余数;重复此操作,直到该十进制数值为复此操作,直到该十进制数值为0为止。为止。最后将所有的余数反向输出就是所对应的二进最后将所有的余数反向输
15、出就是所对应的二进制数值。制数值。5822920214170231212101十进制十进制58的二进制表示为:的二进制表示为:111010publicvoidDToB(intdecVal)SeqStacks=newSeqStack(50);while(decVal!=0)s.Push(decVal%2);decVal/=2;while(!s.IsEmpty()Console.Write(s.Pop().ToString();Console.WriteLine();Console.ReadLine();检验表达式中的括号匹配情况n 假设在一个算术表达式中,可以包含三种括号:圆括假设在一个算术表达
16、式中,可以包含三种括号:圆括号号“(”和和“)”,方括号,方括号“”和和“”和花括号和花括号“”和和“”,并且这三种括号可以按任意的次序嵌套,并且这三种括号可以按任意的次序嵌套使用。比如,使用。比如,.(.).。现。现在需要设计一个算法,用来检验在输入的算术表达式在需要设计一个算法,用来检验在输入的算术表达式中所使用括号的合法性。中所使用括号的合法性。n算术表达式中各种括号的使用规则为:算术表达式中各种括号的使用规则为:出现左括号,出现左括号,必有相应的右括号与之匹配,并且每对括号之间可以必有相应的右括号与之匹配,并且每对括号之间可以嵌套,但不能出现交叉情况嵌套,但不能出现交叉情况。n检验括号
17、是否匹配的方法可以用检验括号是否匹配的方法可以用“期待的急迫程度期待的急迫程度”这个这个概念来描述。概念来描述。n()(),()()是正确的格式,而是正确的格式,而(),()是错是错误的格式误的格式()12345678()()()检验出错的情况n(1)当遇到某一个右括号时,栈已空,说明到目前为止,右括号多)当遇到某一个右括号时,栈已空,说明到目前为止,右括号多于左括号;于左括号;n(2)从栈中弹出的左括号与当前检验的右括号类型不同,说明出现)从栈中弹出的左括号与当前检验的右括号类型不同,说明出现了括号交叉情况;了括号交叉情况;n(3)算术表达式输入完毕,但栈中还有没有匹配的左括号,说明左)算术
18、表达式输入完毕,但栈中还有没有匹配的左括号,说明左括号多于右括号。括号多于右括号。我们可以利用一个栈结构保存每个出现的左括号,当遇我们可以利用一个栈结构保存每个出现的左括号,当遇到右括号时,从栈中弹出左括号,检验匹配情况。在检到右括号时,从栈中弹出左括号,检验匹配情况。在检验过程中,若遇到以下几种情况之一,就可以得出括号验过程中,若遇到以下几种情况之一,就可以得出括号不匹配的结论。不匹配的结论。算法基本思想算法基本思想n凡出现左括号,进栈凡出现左括号,进栈n凡出现右括号,首先检查栈是否是空凡出现右括号,首先检查栈是否是空若栈空,表明右括号多了若栈空,表明右括号多了否则和栈顶元素比较,否则和栈顶
19、元素比较,若相等,则左括号出栈若相等,则左括号出栈否则不匹配否则不匹配n表达式检查结束时,表达式检查结束时,若栈空,则匹配正确若栈空,则匹配正确否则表明左括号多了否则表明左括号多了迷宫求解.算法思想算法思想n若当前位置若当前位置“可通可通”,则纳入,则纳入“路径路径”,继续,继续前进前进n若当前位置若当前位置“不可通不可通”,则后退,换向探索,则后退,换向探索n若四周皆若四周皆“不可通不可通”,则从路径中删除,则从路径中删除汉诺塔问题:汉诺塔问题:n有三根柱子分别叫有三根柱子分别叫A柱、柱、B柱、柱、C柱。现假设有柱。现假设有N个圆盘(都是按从大到小依次放入柱中的)个圆盘(都是按从大到小依次放
20、入柱中的)已经放在了已经放在了A柱上,我们的任务就是把这柱上,我们的任务就是把这N个个圆盘移动到圆盘移动到C柱。但移动的过程,必须遵守大柱。但移动的过程,必须遵守大盘永远在小盘的下面这一个原则。盘永远在小盘的下面这一个原则。栈与递归栈与递归n n递归是一种非常重要的数学概念和解决问题的递归是一种非常重要的数学概念和解决问题的方法,在计算机科学和数学等领域有着广泛的方法,在计算机科学和数学等领域有着广泛的应用。在计算机科学中,许多数据结构,如广应用。在计算机科学中,许多数据结构,如广义表、树和二叉树等,由于其自身固有的递归义表、树和二叉树等,由于其自身固有的递归性质,都可通过递归方式加以定义并实
21、现许多性质,都可通过递归方式加以定义并实现许多问题的算法设计。问题的算法设计。n n在计算机内部,在计算机内部,通过栈来实现递归算法通过栈来实现递归算法。所以。所以递归是栈的一个实际应用。递归是栈的一个实际应用。当在一个函数的运行期间当在一个函数的运行期间调用另一个函数调用另一个函数时,时,在运行该被调用函数在运行该被调用函数之前之前,需要完成三件,需要完成三件事:事:n将所有的实在参数、返回地址等将所有的实在参数、返回地址等信息信息传递给被传递给被调用函数保存调用函数保存n为被调用函数的局部变量为被调用函数的局部变量分配存储存储区分配存储存储区n将将控制转移控制转移到被调用函数的入口到被调用
22、函数的入口从被调用函数返回调用函数从被调用函数返回调用函数之前之前,应完成:,应完成:n保存保存被调用函数的被调用函数的计算结果计算结果n释放释放被调用函数的被调用函数的数据区数据区n依照被调用函数保存的依照被调用函数保存的返回地址返回地址将将控制转移控制转移到到调用函数调用函数多个函数嵌套调用的规则是:多个函数嵌套调用的规则是:后调用先返回后调用先返回内存管理实行内存管理实行“栈式管理栈式管理”递归函数递归函数n斐波纳茨函数:斐波纳茨函数:1,1,2,3,5,8,13n求求n的阶乘的递归函数算法的阶乘的递归函数算法:longlongfact(intfact(intn)n)longf;long
23、f;if(nif(n=0)f=1;=0)f=1;elsef=n*fact(n-1);elsef=n*fact(n-1);returnf;returnf;if(nif(n=0)f=1;=0)f=1;elseelsef=n*fact(n-f=n*fact(n-1);1);returnf;returnf;函数函数fact(4)if(nif(n=0)f=1;=0)f=1;elseelsef=n*fact(n-f=n*fact(n-1);1);returnf;returnf;调用调用fact(3)if(nif(n=0)f=1;=0)f=1;elseelsef=n*fact(n-f=n*fact(n-1)
24、;1);returnf;returnf;调用调用fact(2)if(nif(n=0)f=1;=0)f=1;elseelsef=n*fact(n-f=n*fact(n-1);1);returnf;returnf;调用调用fact(1)if(nif(n=0)f=1;=0)f=1;elseelsef=n*fact(n-f=n*fact(n-1);1);returnf;returnf;调用调用fact(0)函数函数fact(3)函数函数fact(2)函数函数fact(1)函数函数fact(0)函数fact(0)的调用返回一个1值返回1函数fact(1)中f=1*1返回值1返回1函数fact(2)中f=
25、2*1返回值2返回2函数fact(3)中f=3*2返回值6返回6n递归函数:直接调用自身或通过一系列的调用递归函数:直接调用自身或通过一系列的调用语句间接地调用自己的函数语句间接地调用自己的函数调用调用fact(3)调用调用fact(4)longlongfact(intfact(intn)n)longf;longf;if(nif(n=0)f=1;=0)f=1;elsef=n*fact(n-1);elsef=n*fact(n-1);returnf;returnf;调用调用调用调用fact(4)fact(4)fact(4)fact(4)调用调用调用调用fact(3)fact(3)fact(3)fa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第三章栈和队列 第三 队列
限制150内