- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
队列栈链表简要介绍1
队列 、栈、链表简要介绍
————拂晓
队列、栈是两种编程中常用的线性数据结构,在某些问题中适时地使用队列或栈可以使问题的思路变得非常简单、清晰,下面分别介绍这两种数据结构。
一 队列:
队列,就如其名字所表述的意思,就是排队,比如我们在食堂打饭排的队,第一个人在队头买饭,后面的人都在后面排着,第一个人走了,第二个人就变成队的头部,而如果有其他的同学过来打饭,那么他就要成为新的队尾,同时队伍长度也相应变长。
如果我们把打饭排的队用一个整型数组a[N]表示,第一个学生是a[1],第i个学生是a[i],一开始第一个学生是队头,也就是a[1]为头,当第一个学生走了之后第二个学生就成了队头,也就是a[2]变成了头,所以我们可以定义一个变量int head,并将其初值赋成1,当一个学生走了之后就把它加1,这样就实现了一个学生走了之后后面的学生为新的队头,如果现在有m个学生,那么现在的队尾就是a[m],如果来了下一个学生,那么队尾就要变成a[m+1],所以可以再定义一个变量int tail,并赋初值0,因为最初是没有学生来买饭的,每当有一个学生到来,就将tail+1,这样就可以表示队伍的尾部又向后移了一位,由于head和tail都是随时变化的,所以想要判断一个队伍是否为空,需要判断head与tail的关系,如果它们相等,说明队首和队尾是同一个人,也就说明队伍里只有一个人,如果这个人走了,那么head要加1,这时队伍里就正好没有人了,这时head和tail的关系为headtail,这样我们就可以判断队伍是否为空了。
二 栈:
栈表示一种后进先出的数据结构,类似于生活中“一摞”的东西,比如一摞盘子,最先放的在最下面,要最后才能取出,最后放的在最上面,可以直接取出并且每次只能取出最上面的那个,再比如一个乒乓球粗细的小筒,往里面放乒乓球,我们每次可以取出的是我们之前放入的最后一个球,如果同样用一个数组 a[N] 来表示这些筒中的乒乓球, a[1]表示第1个乒乓球,a[2]表示第二个乒乓球,… ,用一个变量top来表示最上面的那个球,那么 a[top]就指向最上面的乒乓球,如果只有一个top,我们就只能找到最上面的乒乓球,这样就符合了栈的要求,这样我们就用一个数组表示了“一摞”乒乓球,也就是一个栈,当一个新的元素到来时,我们就将top加1,并将a[top]赋为新元素的值,当一个元素失去利用价值后,我们就将top减1,这样就等价于将这个元素从栈中删除了,为了防止意外修改栈中除栈顶以外的元素从而破坏逻辑,我们一般除了top外不使用其他变量去作为下标访问栈。
再看一个例子:
假设现在咱们的大校长为了知道计算机系学生算法的学习情况,那么他需要去问计算机的院长,计算机的院长大人又要去问院书记~,书记又要去问系主任,系主任又要去问导员,最后导员了解了学生算法的学习情况后,才能去把结果汇报给主任大人,主任这里才能把结果反馈给书记同志~,书记再反馈给院长,最后院长才能把这个情况告诉校长同志。
如果我们将上级给下级下达任务的过程看成这个下级领导入栈的过程,而下级向上级交任务的过程看成一个出栈的过程,就可以完全使用一个栈来模拟了上面的这个过程。
在计算机中,这个过程其实就是函数调用的过程,当一个函数调用另一个函数的时候,被调用的函数的参数需要入栈,而当这个被调用函数再调用别的函数的时候,被它调用的函数的参数也要入栈,当一个函数完成它的任务需要返回的时候,在栈中存储的它的参数就出栈,这个栈由系统提供,在我们使用递归函数的时候,如果递归层次太深,可以很容易的就将这个栈给填满,从而造成栈溢出的错误,所以有时我们可以自己分配一个栈,来模拟递归函数的过程,从而避免这样的错误。
三 链表:
大家都学过数组,在定义数组的时候,系统为我们的数组分配了一块连续的空间,数组中相邻的元素,在内存中它们也是相邻的,可是这样有两个局限,一:是我们需要事先知道我们需要多少个元素的位置,才能定义一个数组,不便于内存的有效利用;二:相邻的两个元素在数组中的位置也必须相邻。
如果我们定义一个结构体:
struct node
{
int param;
int next;
};
这里param是我们需要存储的变量值,next作为指向与一个node型变量相邻的下一个变量的位置,比如定义一个node n[100],如果n[0].next=20,就是说与第0个变量相邻的是第20个变量,而不必须是与它紧挨着的第1个,这样这个结构体数组中的这些结构体变量就形成了一个逻辑上的链,避免了a[0]的下一个必须是a[1]的限制,使其使用更加灵活,这样的逻辑上抽象出来的链就叫做链表。
使用数组实现逻辑上可以实现一个链表的功能,而且具有速度快
文档评论(0)