《数据结构》堆栈和队.ppt
《《数据结构》堆栈和队.ppt》由会员分享,可在线阅读,更多相关《《数据结构》堆栈和队.ppt(31页珍藏版)》请在三一办公上搜索。
1、数据结构,堆栈与队,堆栈,客栈:住人;货栈:存货。,堆栈:存货的方式是把货物堆码存放,我想把红色的球拿出来,指示货物码放的位置,堆栈溢出,最先进入堆栈的货物压在最底层,栈:一个存放东西的空间,破坏规则,进栈方向,出栈方向,先进后出的工作方式,元素只能在栈顶进出,指示栈顶元素的指针,是操作受限的线性表,堆栈要素,先进的后出,堆栈操作,栈结构如同摞盘子,先放的后出,除去头、尾元素,栈内元素只有唯一的后继和前趋,所以堆栈是线性表.,存储结构,顺序存储结构,链式存储结构,堆栈是线性表,逻辑结构,顺序栈,链栈,堆栈结构,空栈top=-1;,a1,a2,直到栈满,am,元素进栈top=push(stack
2、,x,top);,top+=1;,元素出栈top=pop(stack,top-=1;,if(top=m-1)不能入栈,am-1,直到栈空,if(top0)无元素出栈,程序1.12进栈函数,int push(struct node*p,struct node x,int top)if(top=M-1)printf(“overflow”);esletop+;*(p+top)=x;return(top);,程序1.13出栈函数,int pop(struct node*p,struct node*x,int top)if(top0)printf(“overflow”);else*x=*(p+top);
3、top-;return(top);,顺序结构的堆栈,进栈元素,栈顶指针,栈满处理,元素进栈,总是指向栈顶,更新栈顶指针,栈空处理,栈非空则元素出栈,指向当前栈顶,更新栈顶指针,倒序,a0,a1,an-1,an-1,an-2,an-2,a0,初始栈空,数组an-1,数组an-1依次进栈,栈顶元素依次出栈,习题:线性表A=a1,a2,.,an,元素为字符类型,用向量结构存放,请编写程序,将它倒序为A=an,an-1,.,a1。,一进出栈的过程就能完成序列的倒序。C程序设计强调把算法编程程序,数据结构注重设计算法与逻辑结构实现,回文识别,a0,a1,an-1,an-2,初始栈空,字符串an-1,元素
4、依次进栈,栈顶元素依次出栈,习题:回文是指一字符串从前读和从后读都有一样的字母顺序。设长度为n的字符串在数组arrayn中,求判别arrayn中的字符串是否为回文的C程序实现。,if(strcmp(A,B)printf(flasen);,还有什么更简洁的方法?,比较两个字符串,相等则是回文,回文也是在C程序设计中遇见过的,从过去强调技巧,转变为现在的数据结构方法,注重算法与逻辑结构的实现,编译程序扫描问题堆栈结构在程序编译中被广泛应用。一段程序需要编译成为CPU可执行的机器码才能运行,称为执行文件(*.exe)。编译程序扫描每一行语句时,首先要检查是否存在语法错误,下面的问题说明了利用栈结构检
5、查左右括弧是否匹配的方法。,(1)程序从左至右扫描字符串时判别该字符串中左、右圆括弧是否平衡。如果字符串不平衡,返回字符串中第一个不匹配的圆括弧位置;若平衡则返回正常匹配信息。即遇见第一个不匹配的右圆括弧时,中断扫描并返回其在字符串中的位置.如有多个左圆括弧不匹配就返回第一个不匹配的左圆括弧在字符串中的位置。(2)设长度0至n-1的字符串在数组str80中,写出用栈函数实现该算法的c程序。,括弧匹配,i,f,(,(,a,b,),&,&,(,c,d,),c,=,10,;,问题:从左至右扫描字符串时判别左、右圆括弧是否平衡。,扫描中每遇见一左圆括弧则将其位置进栈,每遇见一个右圆括弧就弹出一个栈顶元
6、素匹配。,当前是右圆括弧且栈空,则右圆括弧不匹配。,扫描结束且栈不空,则有左圆括弧不匹配,算法,top,0,3,扫描指针i,1,4,2,1,11,2,1,输入数组pn,栈stackM,if(i=n)&(stack0!=0)左圆括弧多余,栈底是第一个非法左圆括弧位置,把i=3入栈,弹出栈顶,平衡进出,int balance(char*p,int n,char*message)int i,val,stackLENGTH;stack0=0;for(i=0;in;i+)if(*(p+i)=()push(stack,i);else if(*(p+i)=)if(pop(stack,数组p及n,匹配信息,t
7、op=0,循环匹配,是左括弧就把i入栈,右括弧则应弹出栈顶,平衡进出,栈空?,失衡信息,失衡位置,如扫描结束且栈非空,搜索第一个不匹配的左圆括弧在字符串中的位置,失衡信息,失衡位置,-1时栈空,大于零返回的是失衡位置,小于零是匹配正常,括弧匹配程序,一个直接调用自己,或通过一系列的过程调用语句间接的调用自己的过程(函数)称为递归调用过程(函数)。栈在递归调用中有着重要作用,调用一个函数需要完成:将实参与断点地址传送给被调用函数;为被调用函数的局部变量在栈中分配数据区;从被调用函数入口地址开始执行。从被调用函数返回时正好相反:传递被调用函数的运行结果给调用函数;释放被调函数的数据区;由保存的断点
8、地址返回调用函数。在C语言中已学习过递归的概念,它的每一步都由其前身来定义。递归调用过程中,主调函数又是被调函数。执行递归函数将反复调用其自身。每调用一次就进入新的一层,如果编程中没有设定可以中止递归调用的出口条件,则递归过程会无限制的进行下去,造成系统溢出错误。所以,程序必须有递归出口,即在满足一定条件时不再递归调用。,堆栈与递归,递归应用对象,解决一个现实问题的算法是否应该设计成一个递归调用的形式,完全取决于实际应用问题本身的特性,只有在待处理对象本身具有递归结构特征的情况下,程序才应该设计为递归结构。比如在现实世界中描述一棵树的定义说,树是一个或多个节点组成的有限集合,其中:必有且仅有一
9、个特定的称为根(root)的节点;剩下的节点被分成m0个互不相交的集合T1,T2,Tm,而且其中的每一元素又都是一棵树,称为根的子树(Subtree)。显然树的定义是递归的。,一棵树,一棵树的子树,递归与分治算法,分治法的基本设计思想是将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。如原问题可分割成k个子问题,1kn,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子
10、问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决。否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地求解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。,分治算法适用条件,(1)该问题的规模缩小到一定的程度就可以容易地解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。(3)利用该问题分解出的子问题的解可以合并为该问题的解;(4)该问题所分解出的
11、各个子问题相互独立,即子问题之间不包含公共的子问题。分治法在每一层递归上都有三个步骤:分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;合并:将各个子问题的解合并为原问题的解。,void main(void)long i,n,sum=1;printf(请输入n:n);scanf(%d,递推求n的阶乘,阶乘的递归求解,分治法处理问题的一个例子是求n的阶乘。从减小n的规模考虑,n的阶乘可以看成是n(n-1)!(n-1)!与求n!之间互相独立且问题形式相同:(n-1)!=(n-1)(n-2)!。显然,这是一个递
12、归求解过程。因为我们追求将问题的规模一直分解到它的原子形式,也就是1!=1,同时这就是出口条件。从底层回头,再将各子问题的解合并得到原问题的解,于是,2!=2,3!=6,。,int main(void)long n,sum=1;n=read();if(n0)sum=f(n);printf(n!=%dn,sum);,int f(int n)if(n=1)return(1);return(n*f(n-1);,int read()int n;printf(请输入n值:n);scanf(%d,阶乘函数,分解到最小问题之后的递归出口条件,问题规模的递归分解过程,递归求n的阶乘,f(3),3*f(2),2
13、*f(1),f(1)=1,2*1,3*2*1,6,问题规模的递归分解过程,分解到最小问题之后的递归出口条件,回朔合并,n=3的阶乘递归求解,递归求Fibonacci数列,f(5),f(4),f(3),f(3),f(2)=1,f(2)=1,f(1)=1,f(2)=1,f(1)=1,分解到最小问题之后的递归出口条件,if(n=1)|(n=2)return(1);,递归进行规模分解,return(f(n-1)+f(n-2);,递归是否存在问题?,n=3,需要调用函数f(n)2次n=4,需要调用函数f(n)4次n=5,需要调用函数f(n)8次.调用次数与n是指数关系,即f(n+1)的运行时间是f(n)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 堆栈
链接地址:https://www.31ppt.com/p-5030409.html