关于数据结构中出栈序列问题讨论.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于数据结构中出栈序列问题讨论

关于数据结构中出栈序列问题讨论   摘要:栈是一种非常重要的数据结构,递归、函数调用都离不开栈。对栈的输出研究是栈的一个主要研究内容。本文对三种常见算法进行了比较,并给出了最优算法的具体实现方法。   关键词:栈;出栈序列;数据结构;算法   中图分类号:TP311.12 文献标识码:A文章编号:1007-9599(2011)07-0000-01   Stack Sequence Issues Discussion about Data Structure   Yu Lin   (Chongqing Research Institute of ino-Coal International Engineering Group,Chongqing400039,China)   Abstract:The stack is a very important data structures,recursion,function calls are inseparable from the stack.The output of the stack is a stack main content.This paper compares three common algorithms,optimal algorithm is given a concrete implementation.   Keywords:Stack;Stack sequence;Data structure;Algorithm   一、引言   栈是数据结构中重要的线性结构,是一种特殊的线性表,只允许在表的一段进行插入、删除操作的线性表。表中允许进行插入删除操作的一段称为栈顶,另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称为空栈。栈顶插入操作称为进栈,栈的删除操作称为退栈或者出栈。对于n个元素入栈和出栈的研究是栈的一个主要研究内容,可利用二叉树给出入栈和出栈序列的表示。   二、三种常见算法举例   算法一:   1) 求1,2,3,…,n的一个全排列a1a2a3…an;   2) 判断a1a2a3…an是否为出栈序列,若是则输出;   3) 若所有全排列已求出,则结束;否则转(1)。   该算法时间复杂度为O(n!)。   算法二:   1) 若n=1,则写下唯一的出栈序列;   2) 递归调用该算法求出1作为第k个出栈元素的所有出栈序列。   该算法时间复杂度为O(c(2n,n)/(1+n)),但是该算法在实现时,对产生的每一个出栈序列都要与已有的出栈序列进行对比,看是否重复,然后决定是否将新的出栈序列加入到已有的出栈序列中,这种查找工作使得程序的实际运行时间增长。   算法三:   1) 若n=1,则写出唯一的栈序列1;   2) 否则,递归调用该算法生成1,2,3,…,n-1的所有不同的栈序列,然后生成1,2,3,…,n的所有不同的栈排列,方法是:对于1,2,…,n-1的每一个栈排列,分别将n插入n-1之前,n-1之后,使n与n-1相邻,以及排在n-1后的每一个数之后,即可得到1,2,3,…,n的栈排列。   该算法利用了栈的性质,已知集合N={1,2,3,…,n },如果按照给定的次序1,2,3,…,n依次入栈,则在出栈序列中,对于任何i∈N和j∈N (j>i),若j排在i之前(i左边),要么j与i相邻,要么j与i之间所排的任一数均大于i。可见该算法比较直观有效。   三、三种算法的比较   为了真实比较三种算法的优劣,可以设置一个数组sz[60000][12]用来存放所有出栈序列的结果,每求出一种结果不立即输出,而是保存在数组sz中,要求n≤11,当入栈元素个数为n时,求出所有出栈序列所用时间。通过比较发现算法1和算法2因为递归调用次数太多,而效率低,算法3效果最好。算法1和算法2在大量递归调用过程中需要大量的存储空间,也占用了大量的CPU时间。   四、第三种算法的的具体实现   Char sz[60000][12];   Int used;   Void stack out (char *s)   {char buff[15],ch,step[15],*p,*q1,*q2;   Int len,I,j,num1,num2,num;   Strepy(buff,s);   Len=strlen(buff);   If(len>1)   {ch=buff[len-1];   Buff[len-1]=0;   Stack_out(buff);   Num2=used*(len<<1)*((len<<1-1)/len/(len+

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档